javascript - 查找数组中每个元素的出现次数,并根据出现次数以升序或降序排列它们
问题描述
任务:给定一个包含 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));
解决方案
给定代码中的问题:
看看这个代码示例:
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)) 更快。
推荐阅读
- c++ - 将数学方程转换为 C++ 代码
- docker - 如何从 k8s 中的边车容器测量“主”容器的 CPU/内存使用情况?
- file-permissions - 从基于 LAN 的 Web 应用程序将文件保存到 DMZ 服务器
- python - Matplotlib:根据标准识别条形图中的条形图
- google-bigquery - 如何使用 Bigquery 找到上一页
- sql - 需要帮助对查询进行分组
- javascript - Javascript中数学运算中的连接运算符
- docker - Docker 中的 ElasticSearch 无声无息地死掉并重新启动,但为什么呢?
- bootstrap-4 - .row 类的孩子的高度不同
- jdbc - 在 JMeter 中为 JDBC 请求设置超时?