计算数组中的第二大数(Javascript):似乎在Sandbox中有效,但未通过Hackerrank测试



尝试在CodeSandbox上确定数组(Javascript(中的第二大数字。它似乎运行良好,但未通过CodeWars测试。我添加了一个伪数组,只是为了在Sandbox中运行我自己的测试。(请原谅,我是一个初学者,这是我的第一个StackOverFlow问题(

const nums = [3, 100.3, 88, 1, -2.4, 9, 18];
const getSecondLargest = (nums) => {
const descending = nums.sort((a, b) => b - a);
return descending[1];
};
console.log(getSecondLargest(nums));  // console returns 88

编辑:好吧,所以我用我超累的大脑说了《代码战争》,而我实际上是指《黑客帝国》(很抱歉!(。我意识到他们不一定用NaN测试,但他们确实有重复的数字,所以使用[1]的索引并不理想。练习来自Javascript的10天-第3天:数组https://hackerrank.com/domains/tutorials/10-days-of-javascript

所以我现在尝试了下面的代码,它通过了。。。但是我的代码看起来有点不稳定,有没有更干净的方法来写这个,然后我可以把它和isNan逻辑结合起来吗?

const nums = [3, 100, 88, 100, -2.4, 9, 18];
const getSecondLargest = (nums) => {
const ascending = nums.sort((a, b) => a - b);

if (ascending[ascending.length - 2] === ascending[ascending.length - 1]) {
return ascending[ascending.length - 3];
} else {
return ascending[ascending.length - 2];
}
};
console.log(getSecondLargest(nums));  // console returns 88

看起来数组中可能有字符串,您需要处理它。以下是几种方法:

一种是在排序之前将非数字内容过滤掉。您可以使用CCD_ 1来测试对象";不是一个数字";。

const getSecondLargest = (nums) => {
const descending = nums
.filter(n => !isNaN(n))
.sort((a, b) => b - a);
return descending.length < 2 ? undefined : descending[1];
};

另一种选择是在排序中处理字符串。将它们推到阵列的末尾:

const getSecondLargest = (nums) => {
const descending = nums.sort((a, b) => {
if (isNaN(a) && isNaN(b)) return 0;
if (isNaN(a)) return 1;
if (isNaN(b)) return -1;
return b - a;
});
return descending.length < 2 || isNaN(descending[1]) ? undefined : descending[1];
};

第三种方法是一个简单的for循环,它跟踪两个最高值:

const getSecondLargest = (nums) => {
let max1 = undefined;
let max2 = undefined; 
for (let n of nums) {
if (isNaN(n)) continue;
if (max2 === undefined || n > max2) {
if (max1 === undefined || n > max1 ) {
max2 = max1;
max1 = n;
}
else {
max2 = n;
}
}
}
return max2;
}

最新更新