ホームページ >バックエンド開発 >PHPチュートリアル >PHP の面接の質問、見てみましょう
リーリー
関数を定義し、$listData を渡します
もし...
111
の要素が 222/333/444... の要素と重複する場合は false を返します111
里面的元素,和 222/333/444... 里面的元素有重复,返回false
如果222
里面的元素,和 111/333/444... 里面的元素有重复,返回false
如果333
If222
内部の要素が 111/333/444... 内の要素と重複している場合、false を返します333
内の要素が 111/222/444... 内の要素と重複している場合、false を返しますその他の場合は true を返す
111/222/333/444 の要素の繰り返しを許可し、true を返す
111/222/333/444... の要素の長さが不明です。 .. は文字列と数値です
既知:
$listデータの長さが不明
111/222/333/444...
自分で実装したのですが、アルゴリズムがひどい気がします 他に方法はありますか? リーリー
リーリーその他の場合は true を返す
関数を定義し、$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 を返す
111/222/333/444... の要素の長さが不明です。 .. は文字列と数値です111/222/333/444...
既知:
$listデータの長さが不明
自分で実装したのですが、アルゴリズムがひどい気がします
他に方法はありますか? リーリー
見てみると、前の 2 つの回答は使用できません。 LZは本当に悲惨です。 。
私のサブ配列の定義は、['a', 'b', 'c', 'a'] のような単一の配列です。
私の答え:
リーリー私の答えは、システム関数をより多く呼び出し、より単純に見えますが、PHP array_xxx などの関数の大部分は、これらの関数を使用しない場合、動作効率を比較的向上させることができます。
現在、@springhack が最も効率的です。そして、あらゆる状況において最大の効率を維持できます。
わかりやすい補助参考情報:
元データ:
リーリー$result は次のようになります:
リーリー最初にサブ配列を重複排除してからそれらをマージした結果
リーリー量 (配列要素の数) を上記、いわゆる「最初に部分配列をマージしてから重複を削除した結果」と比較するために使用されます。
リーリー
1 回ループして、現在の要素と他のすべての要素の交差部分を見つけます。 コードは次のとおりです。 リーリー
リーリー
リーリー
クローマシンのコードは最も効率的である必要があるため、自分でデバッグできます。
答えは上にあるので、多次元配列の重複排除について追加させてください
リーリー
多次元配列の重複排除
リーリー
私の答え(原則:交差点を見つけるループ):
リーリー
この配列の値が交差する限り false が返されるということが理解できますか? 。 。
1次元配列も2次元配列と同様に内部で判定が行われます。
<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>
没几行,满足需求。
还原之前那个
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>