题目简述:给定一个数组,里面会出现重复的数字,按照数字出现的频率来对数组进行递增排序,出现次数少的排前面,出现次数多的排后面。如果有的元素出现次数一样多,则数字大的排前面。
我的思路比较耿直,直接维护一个map,然后对map里面的元素进行排序,在输出即可。
var frequencySort = function (nums) {
let hash = new Map()
// 构建一个map {nums[i]: frequency[i]}
for (let i = 0; i < nums.length; ++i) {
if (hash.has(nums[i])) {
hash.set(nums[i], hash.get(nums[i]) + 1)
} else {
hash.set(nums[i], 1)
}
}
let arr = Array.from(hash)
// 排序
arr.sort((a, b) => {
if (a[1] === b[1]) {
// 出现次数相同的,则数字大的排前面
return b[0] - a[0]
} else {
// 按照出现的次数进行递增排前面
return a[1] - b[1]
}
})
let res = []
arr.forEach(el => {
for (let i = 0; i < el[1]; ++i) {
res.push(el[0])
}
})
return res
};
gpt的解法,这里使用的reduce,至于reduce的用法,我觉得要深挖下了
var frequencySort = function(nums) {
// 构建一个map {nums[i]: frequency[i]}
let hash = nums.reduce((acc, num) => acc.set(num, (acc.get(num) || 0) + 1), new Map());
// 转换为数组并排序
let arr = Array.from(hash).sort((a, b) => a[1] === b[1] ? b[0] - a[0] : a[1] - b[1]);
// 重建结果数组
return arr.reduce((res, [num, freq]) => res.concat(Array(freq).fill(num)), []);
};