首页 > 解决方案 > 查找数组中每个元素的出现次数,并根据出现次数以升序或降序排列它们

问题描述

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

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));

标签: javascriptarraysalgorithmsortingmaps

解决方案


给定代码中的问题:

看看这个代码示例:

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)) 更快。


推荐阅读