我在Code-Signal上找到了一个任务(或更像是一个挑战)(一个你可以做一些编程相关任务的网站.谷歌在一次采访中询问了这个特殊任务:
如果你想自己尝试一下:Code-Fight.
解决问题后,您可以看到其他解决方案.
我的任务是“在数组中找到第一个欺骗”.我设法做到这一点(我将展示方式),但我对结果不满意.在调查了顶级解决方案之后,我很困惑,因为我不明白它们在那里发生了什么.
这是(a)给出的示例输入数组
$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;
}
我知道variable variable是什么,但直到现在还没有在野外生活中看到过这一点.
引用变量在这里做什么?这是怎么回事的?它是否以某种方式比较是否已存在此键入键的值? $$v引用数组中的键吗?
不用说,我更喜欢这种方法.这似乎更有效,更好地维护.
这是“常见做法”吗? 解决方法: 它正在创建编号变量. 2美元,1美元,3美元等
foreach中的$v包含当前数字,2.通过$test = 2; echo $$test我们现在可以看到2美元的价格.它通常是空的.现在,通过执行$$v,它将返回当前值(空,或实际上,变量不存在),但会将“1”放入其中.整个语句本身将返回0,因为它不在变量的前面.
考虑以下代码:
$arr = [2, 1, 3, 5, 3, 2];
foreach($arr as $v)
{
$$v ;
}
$test = 3;
echo $$test;
它将显示$3的值等于2,因为我们在$3上做了2次.
这很奇怪的唯一原因是通常你不能使用以数字开头的变量.也许这会让它更清晰?:
$arr = [2, 1, 3, 5, 3, 2];
foreach($arr as $v)
{
$v='a'.$v;
$$v ;
}
echo "a3 = $a3\n"; // 2
echo "a2 = $a2\n"; // 2
echo "a1 = $a1\n"; // 1
echo "a5 = $a5\n"; // 1
回答“这是”常见做法“?”的问题.不,我个人不会使用变量变量,因为在某些情况下这可能被视为安全问题.我个人更喜欢以下解决方案,它是相同的,但使用数组,并没有抛出通知:
function firstDuplicate($a) {
$arr = [];
foreach ($a as $v)
if (in_array($v, $arr))
return $v;
else
$arr[] = $v;
return -1;
}
不过,变量解决方案是一个创新的解决方案! 来源:https://www./content-1-286701.html
|