PHP 求兩個數組的差集-array_diff()的實現

最近面試遇到一個考驗邏輯的問題,求兩個一維數組的差集

考驗一:兩個數字數組,數組 $a =[1,2,3,4,5] ,$b = [1,2,3,4],怎樣快速的找出他們之間缺失的數字

對於我這樣的新手來講,第一選擇確定是使用PHP的自帶函數array_diff,填寫以下:面試

function contrast ($array_1, $array_2)
    {
        $array_3 = array_diff($array_1, $array_2);
        
        return $array_3;
    }
複製代碼

考驗二:面試官對於這樣的結果確定是不滿意的,接着問:若是不使用PHP自帶函數的狀況下怎麼寫?

在不使用PHP自帶函數的狀況下,只能是使用循環來進行了。寫下了以下代碼:數組

function contrast ($array_1, $array_2)
    {
        foreach ($array_1 as $key => $item) {
            if (in_array($item, $array_2)) {
                unset($array_1[$key]);
            }
        }
        return $array_1;
    }   
複製代碼

這樣寫完以後面試官說個人思惟邏輯仍是不夠發散,能夠寫成另外一種方式,本人感受真的是機智。很少說貼代碼:bash

function contrast ($array_1, $array_2)
    {
        $num_1 = 0;
        $num_2 = 0;
        foreach ($array_1 as $key => $item) {
            $num_1 += $item;
        }
        foreach ($array_2 as $key => $item) {
            $num_2 += $item;
        }
        
        return $num_1-$num_2;
    }   
複製代碼

考驗三:對於數字的匹配能夠用相加的方法,若是數組裏面是字符串的話要怎麼優化一下呢?

回來後查閱各類論壇,帖子。終於找到了一種方法:(由於PHP數組的鍵是進行 HASH 組織的,查找很快;而 Value 只是由 Key 組織存放,自己沒有索引,每次查找都是遍歷。)函數

function array_diff($array_1, $array_2) {
        $array_2 = array_flip($array_2);
        foreach ($array_1 as $key => $item) {
            if (isset($array_2[$item])) {
                unset($array_1[$key]);
            }
        }
        return $array_1;
    }
複製代碼
相關文章
相關標籤/搜索