Поэтому я просто вышел из отличного интервью, в котором мне довелось бросить мяч к концу. Тестирование, которое я получил, касалось решения простого вопроса CS.
У вас есть две укусы $a = 'abcd'; $b = 'cdfg';
$a = 'abcd'; $b = 'cdfg';
Используя наиболее эффективный метод, мне было предложено сравнить эти две строки и вернуть любые совпадающие символы. В то время наиболее очевидным (и наименее эффективным) решением было следующее.
'
$matches = array();
$length = strlen($a);
for($i = 0; $i < $length; $i++) {
if(strpos($b, $a[$i]) !== false) {
$matches[] = $a[$i];
}
}
return $matches;
Мне сообщили, что правильное и эффективное решение требует использования хешей.
Может кто-нибудь прокомментировать?
редактировать:
Возвращаемое значение в этом примере должно быть "cd".
Мне сказали, что использование PHP-методов, таких как "array_intersect", будет считаться обманом.
Ваше решение - O(strlen($a) * strlen($b))
, поскольку strpos()
возможно, придется искать все $b
, чтобы найти конкретный символ. "Хеширование", я предполагаю, что они означают "сохранение символов $a
в хэш-таблице":
$a_hash = array();
$length = strlen($a);
for ($i = 0; $i < $length; $i++) {
$a_hash[$a[$i]] = true;
}
$matches = array();
$length = strlen($b);
for ($i = 0; $i < $length; $i++) {
if (array_key_exists($a_hash, $b[$i])) {
$matches[] = $b[$i];
}
}
return $matches;
Предполагая, что операции хэш-таблицы (используя PHP infamous array()
) являются постоянными, это теперь O(strlen($a) + strlen($b))
.