所以我刚刚接受了一次非常出色的采访,我碰巧把球丢到了最后。我给出的测试涉及解决一个简单的CS问题。
你有两个叮咬
$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;
我被告知正确且最有效的解决方案需要使用哈希值 有人可以详细说明吗?
编辑:
此示例中的返回值应为&#34; cd&#34;。
我被告知使用PHP方法,例如&#34; array_intersect&#34;会被视为作弊。
答案 0 :(得分:1)
您的解决方案为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臭名昭着的array()
)是常量时间,现在是O(strlen($a) + strlen($b))
。