简单频率排序 - Codewars 挑战 - JavaScript
Simple Frequency Sort - Codewars Challenge - JavaScript
对于此 CodeWars challenge,想法是按元素的频率对数组进行排序 - 从出现次数最多的到最少出现的次数。所以
solve([2,3,5,3,7,9,5,3,7]) = [3,3,3,5,5,7,7,2,9]
我所做的是将数组变成一个字符串,创建一个频率映射,将该映射中的项目推入排序数组,然后将排序数组中的数值推入最终数组。
function solve(arr){
let myString = JSON.stringify(arr).split('');
let newArr = String(myString).replace(/[[,]/gi, '').replace(/]/, '').split('');
let map = {};
let sortedArr = [];
let stringArray = [];
let finalArray = [];
//create frequency map
newArr.forEach((value, index) => {
if (!map[value]) {
map[value] = 0;
}
map[value] += 1;
})
//sort array of elements by frequency
for (let key in map) {
sortedArr.push([key, map[key]])
}
sortedArr = sortedArr.sort((a, b) => b[1] - a[1]);
for (let i = 0; i < sortedArr.length; i++) {
stringArray.push((sortedArr[i][0].repeat(sortedArr[i][1])).split(''));
}
//make frequency array values numerical
for (let i = 0; i < stringArray.length; i++) {
let smallArray = stringArray[i];
for (let j = 0; j < smallArray.length; j++) {
finalArray.push(Number(smallArray[j]));
}
}
return finalArray;
}
console.log(solve([1,2,3,0,5,0,1,6,8,8,6,9,1]));
我的代码适用于基本测试,但所有随机测试均未通过,据我所知,CodeWars 不为失败的随机测试提供输入 - 所以我不知道知道为什么我的代码失败了。
也请随时重构。
您可以先使用 reduce
方法创建一个对象,其中的值是该特定数字的频率,然后使用 sort
方法首先按频率排序,如果两个数字具有相同的频率,那么你可以按数字排序。
function solve(data) {
const freq = data.reduce((r, e) => {
if (!r[e]) r[e] = 1;
else r[e]++;
return r;
}, {})
return [...data].sort((a, b) => {
return freq[b] - freq[a] || a - b
})
}
console.log(solve([1, 2, 3, 0, 5, 0, 1, 6, 8, 8, 6, 9, 1]))
console.log(solve([2, 3, 5, 3, 7, 9, 5, 3, 7]))
对于此 CodeWars challenge,想法是按元素的频率对数组进行排序 - 从出现次数最多的到最少出现的次数。所以
solve([2,3,5,3,7,9,5,3,7]) = [3,3,3,5,5,7,7,2,9]
我所做的是将数组变成一个字符串,创建一个频率映射,将该映射中的项目推入排序数组,然后将排序数组中的数值推入最终数组。
function solve(arr){
let myString = JSON.stringify(arr).split('');
let newArr = String(myString).replace(/[[,]/gi, '').replace(/]/, '').split('');
let map = {};
let sortedArr = [];
let stringArray = [];
let finalArray = [];
//create frequency map
newArr.forEach((value, index) => {
if (!map[value]) {
map[value] = 0;
}
map[value] += 1;
})
//sort array of elements by frequency
for (let key in map) {
sortedArr.push([key, map[key]])
}
sortedArr = sortedArr.sort((a, b) => b[1] - a[1]);
for (let i = 0; i < sortedArr.length; i++) {
stringArray.push((sortedArr[i][0].repeat(sortedArr[i][1])).split(''));
}
//make frequency array values numerical
for (let i = 0; i < stringArray.length; i++) {
let smallArray = stringArray[i];
for (let j = 0; j < smallArray.length; j++) {
finalArray.push(Number(smallArray[j]));
}
}
return finalArray;
}
console.log(solve([1,2,3,0,5,0,1,6,8,8,6,9,1]));
我的代码适用于基本测试,但所有随机测试均未通过,据我所知,CodeWars 不为失败的随机测试提供输入 - 所以我不知道知道为什么我的代码失败了。
也请随时重构。
您可以先使用 reduce
方法创建一个对象,其中的值是该特定数字的频率,然后使用 sort
方法首先按频率排序,如果两个数字具有相同的频率,那么你可以按数字排序。
function solve(data) {
const freq = data.reduce((r, e) => {
if (!r[e]) r[e] = 1;
else r[e]++;
return r;
}, {})
return [...data].sort((a, b) => {
return freq[b] - freq[a] || a - b
})
}
console.log(solve([1, 2, 3, 0, 5, 0, 1, 6, 8, 8, 6, 9, 1]))
console.log(solve([2, 3, 5, 3, 7, 9, 5, 3, 7]))