所以,我正在努力应对这一挑战,以返回数组中的第三大数字.我已经解决了,直到我意识到我必须考虑到重复的数字.我通过添加3层for变量i,j和k的for循环来处理这个问题.你会在代码中看到我的意思.这不是非常有效或可扩展.
function thirdGreatest (arr) { arr.sort(function(a,b) { if (a < b) { return 1; } else if (a > b) { return -1; } else { return 0; } }); for ( var i = 0; i < arr.length; i++) { for (var j = 1; j < arr.length; j++) { for (var k = 2; k < arr.length; k++) { if (arr[i] > arr[j]) { if (arr[j] > arr[k]) { return arr[k]; } } } } } } console.log(thirdGreatest([5,3,23,7,2,5,10,24,31,31])); // 23 console.log(thirdGreatest([5,31])) // 23 console.log(thirdGreatest([5,4])); // 4 console.log(thirdGreatest([2,4])); // 3
解决方法
既然你已经对数组进行了排序,那么看起来你应该很好地迭代列表并跟踪你已经看过的数字.当您看到三个不同的数字时,返回当前的数字:
var seen = [arr[0]]; for (var i = 1; i < arr.length; i++) { if (arr[i] !== seen[0]) { if (seen.length === 2) { return arr[i]; } seen.unshift(arr[i]); } }
function thirdGreatest (arr) { arr.sort(function(a,b) { return b - a; }); var seen = [arr[0]]; for (var i = 1; i < arr.length; i++) { if (arr[i] !== seen[0]) { if (seen.length === 2) { return arr[i]; } seen.unshift(arr[i]); } } } console.log(thirdGreatest([5,4])); // 3
注意:您可以简化排序回调
arr.sort(function(a,b) { return b - a; }); // With arrow functions: // arr.sort((a,b) => b - a);
回调必须返回一个更大,更小或等于0的数字,它不必完全是-1或1.