Last active
November 4, 2021 17:15
-
-
Save sagittaracc/9e8e58032994f719e8f35668275dfec0 to your computer and use it in GitHub Desktop.
Filter the numbers that have no pair (Yandex interview)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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"; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Output:
Array ( [2] => 3000000 ) 2.0812890529633 ms