Home  >  Q&A  >  body text

一个php的面试题,大家看看

$listData = [
    '111' => ['a', 'b', 'c', 'a'],
    '222' => ['d', 'e', 'f', 'f', 'b'],
    '333' => ['g', 'h'],
    '444' => ['i', 'j'],
    ...
];

定义一个函数,传入$listData
如果111里面的元素,和 222/333/444... 里面的元素有重复,返回false 
如果222里面的元素,和 111/333/444... 里面的元素有重复,返回false 
如果333里面的元素,和 111/222/444... 里面的元素有重复,返回false 
如果 ...

允许 111/222/333/444 自己里面的元素重复,返回true 其他情况返回true

已知:
$listData长度未知
111/222/333/444... 的长度未知
111/222/333/444... 里的元素为字符串和数字

我自己实现了一下,感觉算法很糟,请问有没有其他方法

function test ($array) {

    $tempValueList  = [];
    foreach ($array as $key => $valueList) {
        
        foreach ($valueList as $value) {
            
            $tempValueList[]    = $key . '~' . $value;
        }
    }
    $result         = true;
    foreach ($array as $key => $valueList) {
        
        foreach ($valueList as $value) {
            
            foreach ($tempValueList as $_value) {
                
                $pos    = strpos($_value, '~');
                $_key   = substr($_value, 0, $pos);
                $_val   = substr($_value, $pos + 1);

                if ($key == $_key) {

                    continue;
                }
                if ($_val == $value) {

                    $result = false;
                    break 3;
                }
            }
        }
    }

    return      $result;
}


高洛峰高洛峰2796 days ago614

reply all(2)I'll reply

  • 欧阳克

    欧阳克2016-11-19 13:21:43

    不知道是不是这样:

    $new_arr = [];
    foreach ($listData as $key => $value) {
        foreach ($value as $k => $v) {
            $kv = $k . $v;
            if (in_array($kv, $new_arr)) {
                echo '有重复';exit;
            } else {
                $new_arr[] = $kv;
            }
        }
    }


    reply
    0
  • 三叔

    三叔2016-11-19 13:21:11

    循环一次,当前元素和其它所有元素求交集,代码如下:

        function isExistsInOther($data)
        {
            $temp = [];
            $isExists = true;
            foreach ($data as $key=>$value) {
                $temp = $data;
                unset($temp[$key]);
                if(!$isExists) break;
                @array_walk($temp,function($v,$k) use($value,&$isExists){
                    if($isExists) {
                        $intersect = array_intersect($v,$value);
                        if(!empty($intersect)) {
                            $isExists = false;
                        }
                    }
                });
            }
            return $isExists;
        }
        
        $listData = [
            '111' => ['a', 'k', 'c', 'a'],
            '222' => ['d', 'e', 'f', 'f', 'b'],
            '333' => ['g', 'e'],
            '444' => ['i', 'j']
        ];
        $result = isExistsInOther($listData);
        var_dump($result);
        //true  无交集
        //false 有交集


    reply
    0
  • Cancelreply