所以我正在做一个HackerRank JavaScript挑战(数组部分),基本上我需要找到数组中第二大的数字。我越来越近了,并在讨论中寻找帮助以得到答案,但我对它的工作方式感到困惑。 nums数组是长度为n的数字数组,允许重复。 n可以是1 <= n <10,nums可以是1 <= nums <= 100。 我的代码在这里:
function getSecondLargest(nums)
{
var largestNum = nums[0];
var secondLargest = nums[0];
for (let i = 0; i < nums.length; i++)
{
if (nums[i] > largestNum)
{
secondLargest = largestNum;
largestNum = nums[i];
continue;
}
if ((nums[i] > secondLargest) && (nums[i] < largestNum))
{
secondLargest = nums[i];
}
}
return secondLargest;
因此,通过最终循环迭代,我知道secondLargest =9。
我的问题是,我相信在最后一个循环的末尾,如果是block,则LargestNum = 10。因此,如果LargestNum = 10,那么if语句的要求如何实现。
num [9] = 10(我认为)
largestNum = 10(我认为)
secondlargest = 9(我认为)
if ((nums[i] > secondLargest) && (nums[i] < largestNum))
10不小于10
我得到的答案是正确的,secondLargest = 9;
我不确定代码是如何到达那里的。
答案 0 :(得分:2)
我们使用set来快速,轻松地删除重复的data = [...new Set(data)];
。
function secondHighest(data) {
data = [...new Set(data)]; // Remove dupicates
// New data after removing duplicates
console.log('Data to test', data)
// Max value placeholder
let max = data[0];
// Second largest placeholder
let second_biggest = data[0];
// For loop for our data length
for (let i = 0; i < data.length; i++){
// If current item in data is > max
if(data[i] > max){
// Second largest now equals max
second_biggest = max;
// And max = current data item
max = data[i];
}
// Else if data item > second largest and data item not equal to max
else if (data[i] > second_biggest && data[i]!== max) {
second_biggest = data[i];
}
}
return second_biggest;
}
console.log(secondHighest([1, 2, 3, 4, 50, 60, 60, 7, 8, 9, 99]));
答案 1 :(得分:2)
有重复项:
const secondLargest = nums => {
const desc = nums.sort((a, b) => a - b).reverse();
let i = 0;
let n = desc[i];
while (n >= desc[0]) {
i++;
n = desc[i];
}
return n;
}
console.log(secondLargest([1, 77, 27, 54, 63, 77, 19, 72, 100, 200, 200, 79]));
编辑:
Pi回另一个答案-只需使用Set
,您可以将其缩短为:
const secondLargest = nums => [...new Set(nums)].sort((a, b) => a - b).reverse()[1]
console.log(secondLargest([1, 77, 27, 54, 63, 77, 19, 72, 100, 200, 200, 79]));
编辑#2:
对nums
有什么限制感到好奇-例如,nums
可能是[100,100]
吗?还是[100]
呢?
答案 2 :(得分:1)
如果您使用的是ES6,一个不错的解决方案是:
const nums = [7, 4, 9, 8, 4, 4, 2, 1, 9, 5, 2, 5, 3, 1, 7];
const numsUnique = [...new Set(nums)] // Remove duplicates
const sorted = numsUnique.sort((a, b) => a - b); // Order by ascending
const secondLargest = sorted[sorted.length - 2]; // Get the second last element
答案 3 :(得分:0)
如果我是你,我将做一个max函数来获取最大数目。然后,我将滤除不等于最大值的所有数字,然后在其余数组上再次运行max。
function max(array){ // JavaScript already has Math.max, but it takes arguments so we apply
return Math.max.apply(Math, array);
}
function secondMax(array){
var a = array.slice(), m = max(array); // .slice() so original array is not affected
a = a.filter(function(v){
return v !== m;
});
return max(a);
}
console.log(secondMax([1, 77, 25, 72, 77, 23, 72, 21]));