ホームページ  >  記事  >  バックエンド開発  >  PHP の面接の質問、見てみましょう

PHP の面接の質問、見てみましょう

WBOY
WBOYオリジナル
2016-12-05 13:44:13993ブラウズ

リーリー

関数を定義し、$listData を渡します
111 の要素が 222/333/444... の要素と重複する場合は false を返します 111里面的元素,和 222/333/444... 里面的元素有重复,返回false
如果222里面的元素,和 111/333/444... 里面的元素有重复,返回false
如果333If 222内部の要素が 111/333/444... 内の要素と重複している場合、false を返します
333 内の要素が 111/222/444... 内の要素と重複している場合、false を返します

もし...


111/222/333/444 の要素の繰り返しを許可し、true を返す

その他の場合は true を返す


既知:
$listデータの長さが不明
111/222/333/444...

111/222/333/444... の要素の長さが不明です。 .. は文字列と数値です


自分で実装したのですが、アルゴリズムがひどい気がします 他に方法はありますか? リーリー

返信内容:
リーリー


関数を定義し、$listData を渡します111里面的元素,和 222/333/444... 里面的元素有重复,返回false
如果222里面的元素,和 111/333/444... 里面的元素有重复,返回false
如果333 111 の要素が 222/333/444... の要素と重複する場合、false を返します
222 の場合内部の要素が 111/333/444... 内の要素と重複している場合、false を返します

333 内の要素が 111/222/444... 内の要素と重複している場合、false を返します

もし...

111/222/333/444 の要素の繰り返しを許可し、true を返す
その他の場合は true を返す



既知:
$listデータの長さが不明

111/222/333/444...
111/222/333/444... の要素の長さが不明です。 .. は文字列と数値です

自分で実装したのですが、アルゴリズムがひどい気がします

他に方法はありますか? リーリー

見てみると、前の 2 つの回答は使用できません。 LZは本当に悲惨です。 。

私のサブ配列の定義は、['a', 'b', 'c', 'a'] のような単一の配列です。

私の答え:

リーリー

私の答えは、システム関数をより多く呼び出し、より単純に見えますが、PHP array_xxx などの関数の大部分は、これらの関数を使用しない場合、動作効率を比較的向上させることができます。

現在、@springhack が最も効率的です。そして、あらゆる状況において最大の効率を維持できます。

わかりやすい補助参考情報:

元データ:

リーリー

$result は次のようになります:

リーリー

最初にサブ配列を重複排除してからそれらをマージした結果

リーリー

量 (配列要素の数) を上記、いわゆる「最初に部分配列をマージしてから重複を削除した結果」と比較するために使用されます。

リーリー

1 回ループして、現在の要素と他のすべての要素の交差部分を見つけます。 コードは次のとおりです。 リーリー

リーリー

リーリー

クローマシンのコードは最も効率的である必要があるため、自分でデバッグできます。

答えは上にあるので、多次元配列の重複排除について追加させてください

リーリー

多次元配列の重複排除

リーリー

私の答え(原則:交差点を見つけるループ):

リーリー


この配列の値が交差する限り false が返されるということが理解できますか? 。 。

array_intersect() 関数は動作するようです。しかし、問題は、配列内の値を小さな配列に変換して値を渡すことです。

リーリー

私の答えをチェックしてください、素晴らしいです


1次元配列も2次元配列と同様に内部で判定が行われます。

1次元配列は結合前と結合後の配列の長さを比較します。固有のものを取得します)🎜
<code class="php">function check_repeat($arr){
    $after_arr = [];
    // 对比自身
    foreach($arr as $index => $value){
        $arr[$index] = $after_arr = array_unique($value);
        if(count($value) !== count($after_arr)){
            return true;
        }
    }
    // 对比其他
    $temp = array_shift($arr);
    $cnt  = count($temp);
    foreach ($arr as $index => $value) {
        $cnt += count($value);
        $temp = array_merge($temp, $value);
    }

    return $cnt !== count(array_unique($temp)) ? true : false;
}

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

var_dump(check_repeat($listData));
</code>

<code>function test($listData) {
    $result = array_map('array_unique', $listData);
    foreach ($result as $key => $value) {
        $keys = array_values(array_diff(array_keys($result),[$key]));
        for($i = 0; $i <= count($keys); $i ++) {
            $data = array_merge_recursive($data,$result[$keys[$i]]);
            if ($i == (count($keys) -1) ) {
                $res = array_intersect($value, $data);
            }
        }
        $data = [];
    }
    return !empty($res) === true ? false : true;
}</code>

<code><?php

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

$temp = array();
foreach ($listData as $key => $xxx) {
    foreach ($xxx as $value) {
        if (in_array($value, $temp)) {
            echo $value.' from '.$key.' is in array';
            exit();
        }
    }
    $temp = array_merge($temp, $xxx);
}
echo 'You should get a True!';
</code>

没几行,满足需求。

PHP の面接の質問、見てみましょう

还原之前那个
shiji 的答案

先array_pop,取出最后一项。再取items数组的并集。if并集与最后一项有交集则返回true(表重复)。循环执行。

根据 @大呜 的算法改良了一下。

<code>function checkRepeat2($listData)
{
    $check_arr = $listData;
    foreach ($listData as $key => $val) {
        //之前比较过的key无需再比较
        unset($check_arr[$key]);
        if ($check_arr) {
            // 合并删除后的数组,判断是否存在交集
            //As PHP 5.6 you can use array_merge + "splat" operator to reduce a bidimensonal array to a simple array:
            if (array_intersect($val, array_merge(...$check_arr))) {
                return false;
            }
        }
    }
    return true;
}</code>

不知道是不是这样:

<code>$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;
        }
    }
}</code>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。