快看!这是一道送分算法题,基础数组字符串排序问题
按照每个字符串中字符重复出现的次数从大到小排列;如果次数相同,按照出现次数第二多的字符排序,如果仍然一样多,按照数组中字符串默认顺序进排序,例如:字符串 "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 协议》,转载必须注明作者和本文链接
推荐文章: