不确定为什么要在JavaScript中输入最终的if语句

时间:2019-04-16 01:36:01

标签: javascript

所以我正在做一个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;我不确定代码是如何到达那里的。

4 个答案:

答案 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]));