给定一个整数列表,在列表中找到最频繁出现的整数

时间:2019-04-10 00:09:05

标签: javascript arrays

我最近在一次采访中提出了这个问题。给定整数列表,请在列表中找到最频繁出现的整数并返回数组。我能够回答,但是其中一个测试用例使我失望。

我对应该使用哪种排序方法来对最频繁的整数进行数组排序,并返回数组中包含最常见的整数的所有项目

const arr = [1,1,2,3,3,3,3,4,5,5,10]; // return 3 

const mostCommon = (arr) => {
 if (arr.length < 1 ) {
     return null;
 }
    const map = {};
    let mostFrequentNum = arr[0];
    for (let i = 0; i < arr.length; i++) {
      let currentNum = arr[i];
        !map[currentNum] ? map[currentNum] = 1 : ++map[currentNum];
        // 1. Current has higher count than known max
        if(map[currentNum] > map[mostFrequentNum]) {
        mostFrequentNum = currentNum;
       }
    }
    return mostFrequentNum;
};
mostCommon(arr); // return 3

/* confused how to implement test case below */
// const arr = [5, 99, 3994813, 99, -32, 43, 99, 3994813, 3994813]; 
// return [ 99, 3994813 ]

3 个答案:

答案 0 :(得分:0)

只需像您一样累加计数,然后 完成后即可找到最大计数。

    const arr = [1,1,2,3,3,3,3,4,5,5,10]; 
    
    const mostCommon = (arr) => {
        const map = {};
        for (currentNum of arr) {
          !map[currentNum] ? map[currentNum] = 1 : ++map[currentNum];
        }
        let result = Object.keys(map).reduce((r, n) => {
          if (map[n] > r.c) {
            r.c = map[n];
            r.n = n;
          }
          return r;
        }, { c: -1 });
        return result.n;
    };
    console.log(mostCommon(arr));

    console.log(mostCommon([5, 99, 3994813, 99, -32, 43, 99, 3994813, 3994813]));

.reduce()进程将保留一个对象,该对象包括原始数组中的数字及其计数的字段。

您的问题使用“整数”单数,但您的示例建议您希望 list 的值与最大数量相关。为此,您将修改上面的内容以使用列表而不是简单的标量来维护.reduce()累加器:

    const arr = [1,1,2,3,3,3,3,4,5,5,10]; 
    
    const mostCommon = (arr) => {
        const map = {};
        for (currentNum of arr) {
          !map[currentNum] ? map[currentNum] = 1 : ++map[currentNum];
        }
        let result = Object.entries(map).reduce((r, [n, c]) => {
          if (c > r.max) r.max = c;
          r[c] ? r[c].push(n) : r[c] = [n];
          return r;
        }, { max: -1 });
        return result[result.max];
    };
    console.log(mostCommon(arr));

    console.log(mostCommon([5, 99, 3994813, 99, -32, 43, 99, 3994813, 3994813]));

答案 1 :(得分:0)

我只有1个解决方案;)

aws s3 sync . $S3_CKPT_PATH

答案 2 :(得分:0)

使用Array.reduce()创建具有频率的数字映射。

使用Math.max()Map.values()获得最高频率。

将“映射”转换为条目数组([键,值]),过滤掉频率低于最高频率的项目,并映射到数字列表。

const arr = [1, 1, 2, 3, 3, 3, 3, 4, 5, 5, 10];

const mostCommon = arr => {
  const freqMap = arr.reduce((r, n) => r.set(n, (r.get(n) || 0) + 1), new Map); // create a Map of number by frequency
  
  const highestFreq = Math.max(...freqMap.values()); // get the highest frequency number
  
  return Array.from(freqMap) // convert the Map to an array of entries
    .filter(([, v]) => v === highestFreq) // filter lower frequency items
    .map(([k]) => k); // convert back to an array of numbers
}

console.log(mostCommon(arr));

console.log(mostCommon([5, 99, 3994813, 99, -32, 43, 99, 3994813, 3994813]));