如何在JavaScript数组中查找最高元素的出现次数?

3
function findMaxOccurence(ar){    
        ar.sort().reverse() // Reverses a sorted array Max to min 
        count = 0;
        for(i=0;i<ar.length;i++){
            ++count
            if(i == ar.length - 1){//break out when last element reached
                break
            }
            if(ar[i+1] != ar[i]){
                break
            }
        }
    return count
}

如何在 JavaScript 数组中查找最高元素的出现次数?

现有代码存在什么问题? - Rajesh
这个并不完美运行! - shubham pandey
5个回答

6

你可以使用 reduce 方法来编写更简单的解决方案。

reduce() 方法对累加器和数组中每个元素(从左到右)应用一个函数,以将其减少为单个值。

let dataset = [2,8,4,8,6,4,7,8];
let max= Math.max(...dataset);
var count = dataset.reduce(function(counter, value) {
    return counter + (value === max);
}, 0);
console.log(count);

此外,您可以通过传递回调函数来使用filter方法。

let count = dataset.filter(x => x === max).length;

1
好的解决方案! - Paul Fitzgerald
三个点的意思是什么? - Marco Salerno
1
@MarcoSalerno https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_operator - Paul Fitzgerald
你也可以使用 dataset.filter(x => x === max).length - Rajesh
1
此解决方案的时间复杂度为**O(nlogn) + O(n)**。 - Nina Scholz

2

请查看以下两种方法:

function findMaxOccurence(ar){    
    ar.sort().reverse(); // Reverses a sorted array Max to min
    var count = 1;
    for(var i = 1; i < ar.length; i++){
        if(ar[i] == ar[0])
            count++;
    }
    return count
}

function findMaxOccurence(ar){    
    ar.sort().reverse(); // Reverses a sorted array Max to min
    var count = 1;
    for(var i = 1; i < ar.length; i++){
        if(ar[i] != ar[0])
            break;
        count++;
    }
    return count
}

1
你可以在一个循环中使用一个对象作为临时结果集,使用 Array#reduce

function findMaxOccurence(array) {
    return array.reduce(function(r, a) {
        if (!r || a > r.value) {
            return { value: a, count: 1 };
        }
        if (r.value === a) {
            r.count++;
        }
        return r;
    }, undefined).count;
}

console.log(findMaxOccurence([1, 3, 4, 2, 4, 2, 1, 3]));


1

您可以使用下面提供的两种解决方案,只需记住过滤器方案稍微快一些 ^^

//Code

let dataset = [2,8,4,8,6,4,7,8];

let t0 = performance.now();
countWithReduce(dataset);
let t1 = performance.now();
console.log("Call to countWithReduce took " + (t1 - t0) + " milliseconds.")

t0 = performance.now();
countWithFilter(dataset);
t1 = performance.now();
console.log("Call to countWithFilter took " + (t1 - t0) + " milliseconds.")


//Functions

function countWithReduce(arr){
    let max= Math.max(...arr);
    let count = arr.reduce(function(counter, value) {
        return counter + (value === max);
    }, 0);
    console.log(count);
}

function countWithFilter(arr){
    let max= Math.max(...arr);
    let count = arr.filter(x => x === max).length;
    console.log(count);
}


1
测试的好方案。 - Mihai Alexandru-Ionut

0
function findMaxOccurence(ar){
ar.sort((a, b) => b - a);
let count = 0;
for(let i = 0; i < ar.length; i++){
if(ar[i] === ar[0]){
count++;
}
}
return count;
}

所以,基本上我用这个解决方案的方法是使用sort((a, b) => a - b) 方法。

这将按降序对数组进行排序,这在处理更大的数字(例如102、113等)时最有效,反转方法将无效。

然后创建一个计数变量来跟踪数组中最大元素的出现次数。

然后运行一个for循环,并比较索引中的元素ar [i],如果该元素等于ar [0],则将其添加到计数中,这将是在按降序重新排列元素后的最大元素。


所以,基本上我使用sort((a, b) => a - b)方法对数组进行降序排序,这是最有效的方法,特别是当你处理更大的数字时,例如102、113等,反转方法将不起作用。然后创建一个计数变量来跟踪数组中最大元素的出现次数。然后运行一个for循环,比较ar[i]索引中的元素,并在该元素等于重新排列元素后的最大元素ar[0]时将其添加到计数中。 - Edd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接