如何从javascript中获取数组中的第二大元素

Ama*_*jee 12 javascript

我有一个像这样的整数数组:

arr[20,120,111,215,54,78];
Run Code Online (Sandbox Code Playgroud)

我需要一个函数将数组作为其参数并返回该数组的第二大元素.

Ja͢*_*͢ck 29

最简单的实现,无需修改原始数组:

var arr = Array('20','120','111','215','54','78'),
biggest = -Infinity,
next_biggest = -Infinity;

for (var i = 0, n = arr.length; i < n; ++i) {
    var nr = +arr[i]; // convert to number first

    if (nr > biggest) {
        next_biggest = biggest; // save previous biggest value
        biggest = nr;
    } else if (nr < biggest && nr > next_biggest) {
        next_biggest = nr; // new second biggest value
    }
}

console.log(next_biggest);
Run Code Online (Sandbox Code Playgroud)

演示

  • +1令我惊讶的是,15分钟内人们正在排序数组,而不仅仅是执行一次传球. (3认同)
  • @davin 大多数情况下,在 JavaScript 中,您并不真正关心您的代码是否需要 10 毫秒而不是 3 毫秒,但您关心的是应用程序的简单性。我并不是说这是一个糟糕的答案,它很好,但是这里评论中对性能的关注可能被夸大了。 (3认同)

Mat*_*yas 28

var secondMax = function (){ 
    var arr = [20, 120, 111, 215, 54, 78]; // use int arrays
    var max = Math.max.apply(null, arr); // get the max of the array
    arr.splice(arr.indexOf(max), 1); // remove max from the array
    return Math.max.apply(null, arr); // get the 2nd max
};
Run Code Online (Sandbox Code Playgroud)

演示

UPDATE

正如davin指出的那样,可以通过不进行拼接来增强性能,但暂时用以下内容替换最大值-Infininty:

var secondMax = function (arr){ 
    var max = Math.max.apply(null, arr), // get the max of the array
        maxi = arr.indexOf(max);
    arr[maxi] = -Infinity; // replace max in the array with -infinity
    var secondMax = Math.max.apply(null, arr); // get the new max 
    arr[maxi] = max;
    return secondMax;
};
Run Code Online (Sandbox Code Playgroud)

无论如何,恕我直言最好的算法是杰克的.1次传递,转换为数字.我只是简短,使用内置方法,只想提供它作为替代,以展示你可以实现目标的所有不同方式.

  • 它也会在"[5,3,20,9,20]"等列表中"*失败*". (8认同)
  • 迄今为止唯一正确的O(n)解决方案。 (2认同)
  • @davin它虽然修改了数组。 (2认同)

Den*_*ret 13

最简单的解决方案是排序:

// here's your array :
var stringArray = new Array('20','120','111','215','54','78');

// let's convert it to a real array of numbers, not of strings :
var intArray = stringArray.map(Number);

// now let's sort it and take the second element :
var second = intArray.sort(function(a,b){return b-a})[1]; 
Run Code Online (Sandbox Code Playgroud)

如果你不想要最简单但最快的(你可能不需要它),那么你必须编写for循环并在循环时存储两个最大的元素.

  • `.map(数字)的+1;`<3 (10认同)
  • 如果列表中有两个相同的数字,则会失败. (3认同)
  • @DenysSéguret 不适用于输入,例如-&gt; ['20','120​​','111','215','54','54'] (2认同)
  • 如果有重复项,只需在排序前执行 `intArray = [...new Set(intArray)];` 即可。 (2认同)

Dan*_*Lee 5

首先向后排序,然后获取第二个元素:

['20','120','111','215','54','78'].sort(function(a, b) { return b - a; })[1];
// '120'
Run Code Online (Sandbox Code Playgroud)

显然也适用于字符串。