按照單詞的字母是否相同對字串陣列進行分組
阿新 • • 發佈:2019-01-31
好久不動手寫程式碼了,真得有些生疏了。正所謂:曲不離口,拳不離手;勤行果然還是要常練習的。
上午看到一個面試題,是java版的,然後覺得給學生拿來做測試題不錯,所以嘗試寫了一下,但真去做得時候,發現並不如相像那樣簡單。
需求:
給了一個數組(如: [“cars”, “thing”, “scar”, “dog”, “god”, “arcs”, “the”]),需要把由顛倒字母順序組成的單詞放到同一個陣列(生成後的結果:[[“cars”, “scar”, “arcs”], [“thing”], [“dog”, “god”], [“the”]])
解決思路:
兩重遍歷,第一遍過按照給定陣列過濾,第二重,把當前單詞以外沒有做過比較的單詞與其進行比較
一種寫法的程式碼實現:
<?php
$tool = ["cars", "thing", "scar", "dog", "god", "arcs", "the"]; // 用於遍歷迴圈
$words = ["cars", "thing", "scar", "dog", "god", "arcs", "the"]; // 用於比較、排除的陣列
$res = array( ); // 用於存放結果
// 先遍歷整個陣列
foreach ($tool as $pos => $word) {
$temp = array();
$wordArr = str_split($word );
if (in_array($word, $words)) {
// 以下if判斷從比較陣列中清除當前參與比較的單詞
$tempKey = array_search($word,$words);
if(isset($tempKey)){
unset($words[$tempKey]);
}
$temp[] = $word; // 把當前單詞加入臨時陣列;
}else{
continue; // 跳過已比較過的單詞
}
// 以下迴圈將當前單詞與未參與比較過的單詞進行比較
foreach ($tool as $comparingPos => $comparingWord) {
if (in_array($comparingWord, $words)) {
$comparingArr = str_split($comparingWord);
$intersect = array_intersect($comparingArr, $wordArr);
if (count($wordArr)== count($intersect)) {
$temp[] = $comparingWord; // 把當前單詞加入臨時陣列;
$tempKey = array_search($comparingWord,$words);
if(isset($tempKey)){
unset($words[$tempKey]);
}
}
}else{
continue;// 跳過已比較過的單詞
}
}
// 將比較結果放入陣列
if (!!$temp) {
$res[] =$temp;
}
}
var_dump($res);
後記:
為啥要多餘地寫兩個陣列?因為迴圈計數器的問題。