分享

php – 这个函数如何从数组返回第一个dupe?

 印度阿三17 2019-07-01

我在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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多