快看!这是一道送分算法题,基础数组字符串排序问题
按照每个字符串中字符重复出现的次数从大到小排列;如果次数相同,按照出现次数第二多的字符排序,如果仍然一样多,按照数组中字符串默认顺序进排序,例如: 字符串 "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 协议》,转载必须注明作者和本文链接
查了手册,正常面试的话只能写出粗暴的方法...
@木杉 这个值相同时无法根据健值排序
@木杉 老哥老程序员了吧
@ADKi 哪里哪里,还有很多不懂...
@木杉 这题目只要前两个 出现次数排序 再一样就根据原有位置了,你这把出现次数直接组装成字符串排序的思想还是厉害的
@ADKi 原来如此
送。。送分题???
这么一会就有人做出来了.花了20分钟..查收手册写出来.不查手册,打死也死不出来. 原谅没有吧代码粘贴出来.可是我发现我不会使用markdown语法贴出代码........索性就截图吧...最后结论不看手册不行..哎......
Here is an example of AppleScript:
/**
Time: 上午11:04
*/
function sortArray()
{
$arr = ['aaaaaaaaa',"yytyts", "abcabccaa", "uuuxyy", "mommentem"];
$str_count = [];
foreach ($arr as $key => $val)
{
$len = strlen($val);
for ($i = 0; $i < $len; $i++)
{
if (!isset($str_count[$val][$val[$i]]))
{
$str_count[$val][$val[$i]] = substr_count($val, $val[$i]);
}
}
$str_count[$val] = max($str_count[$val]);
}
arsort($str_count, SORT_NUMERIC);
return array_keys($str_count);
}
//["abcabccaa", "mommentem", "yytyts", "uuuxyy"]
$arr = sortArray();
print_r($arr);
@736713830 还是弄不好格式 算了......
@736713830 mk 贴代码就直接
```php
代码
```
@Rekkles 开玩笑的啦,炸鱼
@736713830 原来一直觉得自己怎么也算个中级开发人员吧,直到看见了这个题,基础方法都不记得。惭愧
原来是这样 完美....
@736713830 测了一下排序结果对不上,字符串当数组用,我都忘了这功能了
@ADKi 做了半个小时,做不出来 太菜了
@ADKi 怎么测试的 我看看..在改进下 ,嘿嘿
@736713830 上面给了正确答案啊,直接把数组带进去跑
@ADKi 楼主你写的呢 ..贴出来,参考参考 啊哈哈哈哈
@736713830 PHP不同版本可能会对 相同数组进行不一样的排序,PHP7 应该是你这样,我换成PHP5.6 就是相同的排序和上面是相反的
@ADKi 也对我确实是用的php 7.1
题目都读不懂,不知道什么意思
@bluegeek 原来的题目还缺字少字,我都补全了。做这个我找到了做数学应用题的感觉
习惯用js写算法,链式操作比较方便
@ADKi 感觉你的思路有点绕
@kevenp 当时这题目都给我绕蒙了。拿笔懵逼的画流程,给写出来的。也就这水平了,所以才看看有没有更清晰的思路 学习下
emmm...我感觉
array_multisort
函数应该可以实现吧.结果