我最近在一次采访中提出了这个问题。给定整数列表,请在列表中找到最频繁出现的整数并返回数组。我能够回答,但是其中一个测试用例使我失望。
我对应该使用哪种排序方法来对最频繁的整数进行数组排序,并返回数组中包含最常见的整数的所有项目
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 ]
答案 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]));