我有一个整数数组:
arr[20,120,111,215,54,78];
我需要一个接收数组作为参数并返回该数组第二大元素的函数。
我有一个整数数组:
arr[20,120,111,215,54,78];
我需要一个接收数组作为参数并返回该数组第二大元素的函数。
最直接的实现方式是,不修改原始数组,迭代并跟踪最大和次大的元素:
function nextBiggest(arr) {
let max = -Infinity, result = -Infinity;
for (const value of arr) {
const nr = Number(value)
if (nr > max) {
[result, max] = [max, nr] // save previous max
} else if (nr < max && nr > result) {
result = nr; // new second biggest
}
}
return result;
}
const arr = ['20','120','111','215','54','78'];
console.log(nextBiggest(arr));
如果在非空数组中没有与最大值不同的下一个最大值,则返回-Infinity
的行为可以在函数末尾进行修改,具体取决于需求。
return result == -Infinity ? max : result;
对于一个空数组,这将像以前一样返回 -Infinity
,但如果没有找到下一个不同的最大值,则会返回与最大值相同的值。
return result == -Infinity ? null : result;
与上面相同,但null
的返回值更能说明下一个不同的最大值不存在。
5
,对于列表 [5,10,10]
。 - jAndyvar 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
};
正如davin所指出的,性能可以通过不使用splice而是通过-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;
};
无论如何,在我看来最好的算法是Jack的。只需1次遍历,转换为数字。 我的算法很简短,使用内置方法,只想提供它作为一种替代方案,展示实现目标的不同方式。
包含多个值的边缘情况。
正如评论所指出的那样:如果我们有一个数组,例如[3, 3, 5, 5, 5, 4, 4]
,则此解决方案“无效”。
另一方面,对于“第二大元素”,我们会考虑什么才算“第二大元素”,这也是一种解释方式。在该示例中:
“第二大元素”可以解释为:
O(n)
解法。 - davin-Infinity
是一个很好的观点.. - Ja͢ck[5,3,20,9,20]
这样的列表上也会“失败”。 - jAndy最简单的解决方案是排序:
// 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];
如果你不需要最简单的方法但需要最快速的方法,那么你需要编写一个 for
循环并在循环时存储两个最大元素。
.map(Number)
的方法。 <3 表示喜欢或者爱。 - jAndyintArray = [...new Set(intArray)];
。 - Henrikh Kantuni首先将它倒叙排列,然后获取第二个元素:
['20','120','111','215','54','78'].sort(function(a, b) { return b - a; })[1];
// '120'
Number
,只不过它是隐式地进行的。 - davin对数组进行排序,然后返回第二个索引。
var arr = ['20','120','111','215','54','78'];
arr.sort(function(a,b){
return b-a;
});
console.log(arr[1]);
function getSecondLargest(nums) {
return [...new Set(nums)].sort((a,b)=>b-a)[1]
}
function second_highest(arr)
{
var second_highest = arr.sort(function(a, b) { return b - a; })[1];
return second_highest;
}
将数组从小到大排序,然后使用.length-2
获取倒数第二个。
var myArray =['20','120','111','215','54','78'];
var secondLargest = myArray.sort(function(a,b){return a - b})[myArray.length-2];
alert(secondLargest); //120;
以下是使用过滤器和归约方法的解决方案:
arr = [20,120,111,215,54,78];
const secondMax = arr
.filter((ele)=> ele !== Math.max(...arr))
.reduce((acc, ele) => ele > acc ? ele : acc , arr[0])
Math.max(...arr.filter(x => x !== Math.max(...arr)))
呢? - MoRearr.slice(2).reduce((x, y) => [...x, y].sort((a, b) => b - a).slice(0, 2), arr.slice(0, 2))[1]
- MoRearr.slice(2).reduce((x, y) => y > x[0] ? [y, x[0]] : x[0] > y > x[1] ? [x[0], y] : x, arr.slice(0, 2).sort())[1]
- MoRe
'20' < '120' === false
,而20 < 120 === true
。 - Mattias Buelensfunction processData(myArray) { var setArray = Array.from(new Set(myArray)).sort((a, b) => a - b) return setArray[setArray.length - 2] || myArray[0]; }
- Suresh Prajapatiif (secondLargeNumber == undefined) { secondLargeNumber = 0; } console.log('biggestNumber: ' + biggestNumber); console.log('secondLargeNumber: ' + secondLargeNumber); return secondLargeNumber; }
- Ozan BAYRAM