快看!这是一道送分算法题,基础数组字符串排序问题

按照每个字符串中字符重复出现的次数从大到小排列;如果次数相同,按照出现次数第二多的字符排序,如果仍然一样多,按照数组中字符串默认顺序进排序,例如: 字符串 "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 协议》,转载必须注明作者和本文链接
做自己
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 29

查了手册,正常面试的话只能写出粗暴的方法...

$chars = ["yytyts", "abcabccaa", "uuuxyy", "mommentem", "aaaaaaaaaaaa"];

function sortArray($chars)
{
    $keys = [];
    foreach ($chars as $k => $str) {
        $str = str_split($str);
        $counts = array_count_values($str);
        arsort($counts);

        foreach ($counts as $key2 => $count) {
            $counts[$key2] = sprintf("%'.010d", $count);
        }

        $keys[$k] = implode('-', $counts);
    }

    arsort($keys);

    $new_chars = [];
    foreach ($keys as $key => $v) {
        $new_chars[] = $chars[$key];
    }

    return $new_chars;
}

print_r(sortArray($chars));
6年前 评论
DukeAnn

@木杉 这个值相同时无法根据健值排序

file

6年前 评论
DukeAnn

@木杉 老哥老程序员了吧

6年前 评论

@ADKi 哪里哪里,还有很多不懂...

6年前 评论
DukeAnn

@木杉 这题目只要前两个 出现次数排序 再一样就根据原有位置了,你这把出现次数直接组装成字符串排序的思想还是厉害的

6年前 评论

送。。送分题???

file

6年前 评论

这么一会就有人做出来了.花了20分钟..查收手册写出来.不查手册,打死也死不出来. 原谅没有吧代码粘贴出来.可是我发现我不会使用markdown语法贴出代码........索性就截图吧...最后结论不看手册不行..哎......

file

file

6年前 评论

Here is an example of AppleScript:

<?php

/**

  • Created by PhpStorm.
  • User: wangqingxian
  • Date: 2017/8/1
  • 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);

6年前 评论

@736713830 还是弄不好格式 算了......

6年前 评论
DukeAnn

@736713830 mk 贴代码就直接

```php

代码

```

6年前 评论
DukeAnn

@Rekkles 开玩笑的啦,炸鱼

6年前 评论
DukeAnn

@736713830 原来一直觉得自己怎么也算个中级开发人员吧,直到看见了这个题,基础方法都不记得。惭愧

6年前 评论

原来是这样 完美....

<?php
/**
 * Created by PhpStorm.
 * User: wangqingxian
 * Date: 2017/8/1
 * 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);
6年前 评论
DukeAnn

@736713830 测了一下排序结果对不上,字符串当数组用,我都忘了这功能了

6年前 评论

@ADKi 做了半个小时,做不出来 太菜了

file

6年前 评论

@ADKi 怎么测试的 我看看..在改进下 ,嘿嘿

6年前 评论
DukeAnn

@736713830 上面给了正确答案啊,直接把数组带进去跑

6年前 评论

file 没毛病啊.现在发现一个问题,出现相同的值就挂了..啊哈哈哈哈哈@ADKi 我上面的代码只不过把数组里面多加了个元素 ['aaaaaaaaa',"yytyts", "abcabccaa", "uuuxyy", "mommentem"];

6年前 评论

@ADKi 楼主你写的呢 ..贴出来,参考参考 啊哈哈哈哈

6年前 评论
DukeAnn

@736713830 PHP不同版本可能会对 相同数组进行不一样的排序,PHP7 应该是你这样,我换成PHP5.6 就是相同的排序和上面是相反的

6年前 评论

@ADKi 也对我确实是用的php 7.1

6年前 评论

题目都读不懂,不知道什么意思

6年前 评论
DukeAnn

@bluegeek 原来的题目还缺字少字,我都补全了。做这个我找到了做数学应用题的感觉

6年前 评论

习惯用js写算法,链式操作比较方便

function getCharValue(str) {
    let hash = {};
    let arr = [];
    for(let i=0; i<str.length; i++) {
        let v = str[i];
        hash[v] = hash[v] === undefined ? 1 : hash[v] + 1
    }
    for(let key in hash) {
        arr.push({
            key: key,
            value: hash[key]
        }); 
    }

    let ret = [];
    arr.sort(function(a, b) {
        return a.value < b.value;
    }).forEach(function(item) {
        ret.push(item.value);
    });  
    return ret;
}

function sortArray(strings) {
    let arr = [];
    for(let k in strings) {
        let v = strings[k];
        arr.push({
            key: v,
            value: getCharValue(v)
        })
    }

    let ret = [];
    arr.sort(function(a, b) {
        a = a.value;
        b = b.value;
        let lena = a.length;
        let lenb = b.length;
        let n = lena < lenb ? lena : lenb;

        for(let i=0; i<n; i++) {
            if(a[i] < b[i]) {
                return true;
            }
            else if(a[i] > b[i]) {
                return false;
            }
        }
        return lena == n ? false : true;
    }).forEach(function(item) {
        ret.push(item.key);
    });
    return ret;
}

let strings = ["yytyts", "abcabccaa", "uuuxyy", "mommentem", "aaaaaaaaaaaa"];
console.log( sortArray(strings) );
6年前 评论
$arr = ["yytyts", "abcabccaa", "uuuxyy", "mommentem"];

$map = [];
foreach($arr as $val) {
    $strArr = str_split($val);
    $charMap = array_count_values($strArr);
    arsort($charMap);
    $map[] = array('str'=>$val,'sortDesc' => array_values($charMap));
}

usort($map,'mySort');

$dstArr = array_column($map, 'str');
var_dump($dstArr);

function mySort($c, $d){
    $a = $c['sortDesc'];
    $b = $d['sortDesc'];
    if($a[0] > $b[0]) {
        return -1;
    }
    else if($a[0] == $b[0]){
        if($a[1] > $b[1]){
            return -1;
        }
        elseif($a[1] == $b[1]){
            return 0;
        }
        else{
            return 1;
        }
    }
    else{
        return 1;
    }
}
6年前 评论

@ADKi 感觉你的思路有点绕

6年前 评论
DukeAnn

@kevenp 当时这题目都给我绕蒙了。拿笔懵逼的画流程,给写出来的。也就这水平了,所以才看看有没有更清晰的思路 学习下

6年前 评论

emmm...我感觉array_multisort函数应该可以实现吧.

$beforeStrs = ["yytyts", "abcabccaa", "uuuxyy", "mommentem"];
$sortArrayLists = [];
$sort1 = [];
$sort2 = [];
foreach ($beforeStrs as $key=>$beforeStr) {
  $_lists['str'] = $beforeStr;
  $valuesCount = array_count_values(str_split($beforeStr));
  arsort($valuesCount);
  $maxValuesCount = current($valuesCount);
  $sort1[] = $maxValuesCount;
  $_lists['max_value_cont'] = $maxValuesCount;
  $_lists['before_index'] = $key;
  $sortArrayLists[] = $_lists;
  $sort2[] = $key;
}
array_multisort($sort1, SORT_DESC, $sort2, SORT_ASC, $sortArrayLists);
$afterStrs = array_column($sortArrayLists,'str');
print_r($afterStrs);

结果

Array ( [0] => abcabccaa [1] => mommentem [2] => yytyts [3] => uuuxyy )
6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!