问题描述
Input: [2,1,9,2,5,6,1]
Output: [5,1]
按照上面的转换。
如果频率保持相同的升序,即 5,9 具有相同的频率,即 1,因此它们按升序添加,然后是 2(频率 2)和 1(频率 4) .
请帮助如何使用 javascript 实现这一点
解决方法
使用 array#reduce
为对象累加器中的每个数字创建一个频率对象,然后根据此对象对数组进行排序,对于具有相同频率的数字,根据它们的值对其进行排序。
const arr = [2,1,9,2,5,6,1],frequency = arr.reduce((r,v) => {
r[v] = (r[v] || 0) + 1;
return r;
},{});
arr.sort((a,b) => frequency[a] - frequency[b] || a - b);
console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
使用三元运算符计算出现频率
function sortByFrequency(myArray){
var arr = [];
var frequency = {};
var i=myArray.length-1;
for (var i;i>-1;i--){
var tmp = myArray[i];
frequency[tmp]==null?frequency[tmp]=1:frequency[tmp]++;
}
for (var tmp in frequency){
arr.push(tmp);
}
function FreqCompare(x,y){
return frequency[y]-frequency[x];
}
return arr.sort(FreqCompare);
}