【问题标题】:Finding occurences of each element in an array and aranging them according to the count of occurences in ascending or descending order查找数组中每个元素的出现次数,并根据出现次数以升序或降序排列它们
【发布时间】:2021-06-26 14:44:53
【问题描述】:

任务:给定一个包含 N 个元素的数组。找出每个字符出现的次数,并按出现次数的递减顺序打印,如果出现2个或更多次数相同的次数,则按递减顺序打印。

  • 输入大小:|N| <= 100000
  • 示例测试用例:
INPUT
3 3 4 4 7 8
OUTPUT
4 3 8 7

我可以将其转换为地图,但我应该采取哪些进一步的步骤来获得答案?

    
function asc(arr) {
    let map = new Map
    let c = 1;
    for (let i = 0; i < arr.length; i++) {
        if (map.has(arr[i])) {
            map.set(arr[i], map.get(arr[i]) + 1)
        }
        else {
            map.set(arr[i], c)
        }
    }
    let narr = [...map];
    let tmp;
    for (i = 0; i < narr.length; i++) {
        for (j = i + 1; j < narr.length; j++) {
            if (narr[i][1] > narr[j][1]) {
                tmp = narr[i];
                narr[i] = narr[j];
                narr[j] = tmp;
            }
            else if ((narr[i][1] = narr[j][1])) {
                if (narr[i][0] > narr[j][0]) {
                    tmp = narr[i];
                    narr[i] = narr[j];
                    narr[j] = tmp;
                }
            }
        }
    }
    return narr;
}
arr = [3, 8, 7, 4, 7, 3, 4];
console.log(asc(arr));

【问题讨论】:

    标签: javascript arrays algorithm sorting maps


    【解决方案1】:

    给定代码中的问题:

    看看这个代码示例:

    else if ((narr[i][1] = narr[j][1])) {
        if (narr[i][0] > narr[j][0]) {
            tmp = narr[i];
            narr[i] = narr[j];
            narr[j] = tmp;
        }
    }
    

    在第一行,有一个错误:比较与赋值混淆。这就是为什么您的示例中 8 的频率变为 2 的原因。

    应该改写为:

    else if (narr[i][1] == narr[j][1]) {
    

    我的建议:

    这个建议的原因是,语言中的sort 比您实现的二次排序 (O(n^2)) 更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多