我有一个重复值的数组:
[0, 1, 6, 0, 1, 0]
返回特定值重复的最高数量的有效方法是什么?
在示例数组中,我希望脚本返回 3,因为数字 0 重复次数最多,并且重复了 3 次。我已经在使用 jQuery 和 Underscore。
我有一个重复值的数组:
[0, 1, 6, 0, 1, 0]
返回特定值重复的最高数量的有效方法是什么?
在示例数组中,我希望脚本返回 3,因为数字 0 重复次数最多,并且重复了 3 次。我已经在使用 jQuery 和 Underscore。
这类似于基本方法,但使用了下划线reduce
和max
函数。如果您有一个非常非常大的数组,我希望很清楚如何在 reduce 之前将其与 map 阶段并行化。
var arr = [1,0,2,3,4,0,3,0];
var counts = _.reduce(arr, function(counts, val) {
if (counts[val]) {
counts[val]++;
} else {
counts[val] = 1;
}
return counts;
}, {});
return _.max(counts);
是的,这就像一个谷歌面试问题哈哈。我建议您在数组中循环一次,并在增加计数器时在遇到每个元素时维护一个关联数组。
例如:
var a = [0, 0 , 2, 2, 3, 3, 3, 3];
var counts = {};
for(var i = 0, il = a.length; i < il; i++){
var num = a[i];
if(typeof counts[num] === 'undefined'){
counts[num] = 0;
}
counts[num]++;
}
var max = -1;
for(var c in counts){
if(counts[c] > max){
max = counts[c];
}
}
console.log(max);
一个 hacky 方法可能是对其进行排序,在每次值更改时对其进行拆分,然后查看每个字符串的长度,但让我们尝试一些更合理的方法:
var nums = [0, 1, 6, 0, 1, 0]
var occurence = {}
$.each(nums, function(a, num_id) {
if (occurence[num_id] != null) {
occurence[num_id]++;
} else {
occurence[num_id] = 1;
}
});
然后,occurrence 将具有 nums 中每个值的出现次数,数字本身就是键。