简单频率排序 - 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]))