方法一 个人方法
用数组的键值对形式保存每个数字和他出现的次数,将对象的键值对转为数组,对数组进行自定义sort()排序,优先使用出现频次排序,如果出现频次一样就用大小就行排序。
排序完后按照出现频次拼接成字符串再转为数组
var frequencySort = function(nums) {
let arr= {}
for(let num of nums){
if(arr[num]){
arr[num]++
}else[
arr[num]=1
]
}
let list=Object.entries(arr)
list.sort((a,b)=>{
if(a[1]===b[1]){
return (b[0]-'')-(a[0]-'')
}
return a[1]-b[1]
})
let str = ''
for(let item of list){
str+=(item[0]+',').repeat(item[1])
}
str=str.slice(0,str.length-1)
return str.split(',')
};
消耗时间和内存情况:
方法二 Map集合
用Map集合记录数字和出现的次数,按照元素频率和数值对数组进行排序即可。
var frequencySort = function(nums) {
const cnt = new Map();
for (const num of nums) {
cnt.set(num, (cnt.get(num) || 0) + 1);
}
const list = [...nums];
list.sort((a, b) => {
const cnt1 = cnt.get(a), cnt2 = cnt.get(b);
return cnt1 !== cnt2 ? cnt1 - cnt2 : b - a;
});
const length = nums.length;
for (let i = 0; i < length; i++) {
nums[i] = list[i];
}
return nums;
};
消耗时间和内存情况: