我在 Code-Signal 上找到了一项任务(或者更像是一个挑战)。这是谷歌在面试中提出的一个特殊问题:
如果你想自己尝试一下,可以去 Code-Fight。
解决问题后,你可以看到其他解决方案。
我的任务是“在数组中找到第一个重复项”。我成功地完成了这个任务(我会展示方法),但我对自己的结果不满意。在调查了顶级解决方案之后,我感到困惑,因为我不明白那里发生了什么。
这是一个给定的输入数组示例。
我的解决方案:
它在每个测试用例中都有效,并且我解决了这个挑战。然而,最优解是这个:
我知道什么是变量变量, 但在现实生活中还没有看到过,直到现在。
这里的references变量是做什么用的?它如何返回一个重复的值?它是否比较某个键是否已经有了这个类型的值?
不用说,我更喜欢这种方法。它似乎更高效、更易于维护。
这是"常见做法"吗?
如果你想自己尝试一下,可以去 Code-Fight。
解决问题后,你可以看到其他解决方案。
我的任务是“在数组中找到第一个重复项”。我成功地完成了这个任务(我会展示方法),但我对自己的结果不满意。在调查了顶级解决方案之后,我感到困惑,因为我不明白那里发生了什么。
这是一个给定的输入数组示例。
$a = [2, 1, 3, 5, 3, 2]
我的解决方案:
function firstDuplicate($a) {
$onlyDupesArray= array();
$countedValues = array_count_values($a);
// remove all entries which are only once in the array
foreach($a as $k => $v) {
if($countedValues[$v] > 1) {
$onlyDupesArray[$v] = $v;
}
}
// get rid of dupes
$uniqueDupesArray = array_unique($onlyDupesArray);
$firstEncounter = PHP_INT_MAX;
foreach($uniqueDupesArray as $k => $v) {
if(array_keys($a, $v)[1] < $firstEncounter) {
$firstEncounter = array_keys($a, $v)[1];
}
}
if(is_null($a[$firstEncounter])) {
return -1;
} else {
return $a[$firstEncounter];
}
}
它在每个测试用例中都有效,并且我解决了这个挑战。然而,最优解是这个:
function firstDuplicate($a) {
foreach ($a as $v)
if ($$v++) return $v;
return -1;
}
我知道什么是变量变量, 但在现实生活中还没有看到过,直到现在。
这里的references变量是做什么用的?它如何返回一个重复的值?它是否比较某个键是否已经有了这个类型的值?
$$v++
是引用数组中的一个键吗?不用说,我更喜欢这种方法。它似乎更高效、更易于维护。
这是"常见做法"吗?
error_reporting=0
设置为编程首选的人所选举为最佳之一。但他仍然很聪明。 - hanshenrik