所以,我正在努力应对这一挑战,以返回数组中的第三大数字.我已经解决了,直到我意识到我必须考虑到重复的数字.我通过添加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.