快看!這是一道送分演算法題,基礎陣列字串排序問題

DukeAnn發表於2017-08-01

按照每個字串中字元重複出現的次數從大到小排列;如果次數相同,按照出現次數第二多的字元排序,如果仍然一樣多,按照陣列中字串預設順序進排序,例如: 字串 "abcabccaa" 中出現次數最多的字元是 a , 出現了 4 次;出現次數第二多的是 c , 出現了 3 次;出現次數第三多的是 b , 出現了 2 次 那麼
["yytyts", "abcabccaa", "uuuxyy", "mommentem"]
排序之後的結果是:
["abcabccaa", "mommentem", "yytyts", "uuuxyy"]
請根據以上條件,實現sortArray()方法

昨天看到的一個題目做了一個多小時,很考驗PHP基礎字元和陣列函式。

我的方法:

function strToArr($str)
{
    $arr = str_split($str);
    // 計算重複的值進行排序
    $arr = array_count_values($arr);
    arsort($arr);
    return $arr;
}

// 先根據陣列值排序再根據陣列鍵排序
function multisort($array) {
    $keys = array_keys($array);
    $vals = array_values($array);
    array_multisort($vals, SORT_DESC, $keys);
    dd($keys, $vals);
    //將排序後的鍵和值重新組合成陣列
    $arr = array_combine($keys, $vals);
    return $arr;
}

function sortArray($array)
{
    $count_arr = 2;
    // 拆分陣列
    foreach ($array as $key => $val){
        // 獲取計算好的陣列
        $arr[$key] = strToArr($val);
    }
    // 構建排序用陣列,只要前兩個
    $array_new = [];
    for ($i = 0; $i < $count_arr; $i++) {
        foreach ($arr as $key => $val) {
            $array_new[$i][$key] = array_shift($arr[$key])?:0;
        }
        arsort($array_new[$i]);
    }
    // 獲取排序key
    $array_sort = [];
    for ($i = 0; $i < count($array); $i++) {
        $keys[] = intval($array_new[0][$i].$array_new[1][$i]);
    }
    // 先根據陣列值排序再根據陣列鍵排序
    $keys = multisort($keys);
    // 根據key排序獲取新陣列
    foreach ($keys as $key => $val) {
        $array_sort[] = $array[$key];
    }

    return $array_sort;
}
$array = ["yytyts", "abcabccaa", "uuuxyy", "mommentem"];
echo '<pre>';
print_r(sortArray($array));

不知道有沒有更6的方法,求教

本作品採用《CC 協議》,轉載必須註明作者和本文連結

做自己

相關文章