Skip to content

Instantly share code, notes, and snippets.

@sagittaracc
Last active November 4, 2021 17:15
Show Gist options
  • Save sagittaracc/9e8e58032994f719e8f35668275dfec0 to your computer and use it in GitHub Desktop.
Save sagittaracc/9e8e58032994f719e8f35668275dfec0 to your computer and use it in GitHub Desktop.
Filter the numbers that have no pair (Yandex interview)
<?php
class LonelyNumberFilter {
private $numbers;
private $filtered = [];
function __construct($numbers) {
$this->numbers = $numbers;
}
public function apply() {
foreach ($this->numbers as $i => $number) {
if ($this->haveSeen($number)) {
$this->markAsPaired($number, $i);
}
else {
$this->markAsLonely($number, $i);
}
}
return $this->getLonelyNumbers();
}
private function haveSeen($number) {
return $this->alreadyBeenMarkedAsLonely($number);
}
private function alreadyBeenMarkedAsLonely($number) {
return isset($this->filtered[$number]);
}
private function markAsPaired($number, $i) {
$this->unmarkAsLonely($number);
}
private function unmarkAsLonely($number) {
unset($this->filtered[$number]);
}
private function markAsLonely($number, $i) {
$this->filtered[$number] = $i;
}
private function getLonelyNumbers() {
return $this->filtered;
}
}
$data = array_fill(0, 3000000, 1);
$data[] = 2;
$time_start = microtime(true);
$theNumber = (new LonelyNumberFilter($data))->apply();
$time_end = microtime(true);
$time = $time_end - $time_start;
print_r($theNumber);
echo "$time ms";
@sagittaracc
Copy link
Author

sagittaracc commented Nov 4, 2021

Output:
Array ( [2] => 3000000 ) 2.0812890529633 ms

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment