嗨,我应该创建一个返回第二大数字的函数。我开始这样做是为了运行该函数以查找最大数量。然后,我想从我的数组中忽略最大的数字,然后再次运行相同的函数。我只允许使用循环。推送,弹出式切片,索引,循环和条件
我尝试过切换循环的位置并使用变量。我试图改变事情的范围。我还打算制作一个新的空数组变量,运行一个循环,然后将所有不是最大的项目推入那里,然后在该数组上运行最大数量的函数。
var largest = 0;
var findSecondLargest = function(array) {
for (b = array.length; b > 0; b--)
largest = findLargest(array); {
console.log(largest + "largest" + array)
}
for (n = array.length; n > 0; n--)
if (array[n] >= largest)
array.splice(n, 1);
else if (array[n] > array[b])
array.splice(n, 1);
else if (array[n] < array[b])
array.splice(-1, 1);
return array;
};
var findLargest = function(array1) {
for (x = 0; x <= array1.length; x++) {
for (j = array1.length; j > 0; j--) {
if (array1[j] > array1[x])
array1.splice(x, 1);
else if (array1[x] > array1[j])
array1.splice(-1, 1);
}
}
return (array1);
};
findSecondLargest([89, 28, 22, 20, 41, 1, 39, 41, 67]);
findSecondLargest([89, 28, 22, 20, 41, 1, 39, 41, 67]) // returns 67
这是应该做的,但只返回89。我认为这是因为当我尝试定义变量“最大”时,原始参数数组被更改了。
答案 0 :(得分:2)
排序很浪费。我们可以使用线性空间和时间来确定第二大数字-
const secondLargest = (xs = []) =>
xs.reduce
( ([ $0, $1 ], x) =>
x >= $0
? [ x, $0 ]
: x >= $1
? [ $0, x ]
: [ $0, $1 ]
, [ -Infinity, -Infinity ]
)
[1]
console.log(secondLargest([89, 28, 22, 20, 41, 1, 39, 41, 67]))
// 67
答案 1 :(得分:1)
您发现第二大元素的想法行得通,但是,我认为您的代码过于复杂了。
第一步是创建一个函数,该函数将找到数组中最大元素的 index 。您可以通过将max元素的索引存储在数组中来完成此操作,并遍历数组中的所有元素以更新此变量:
function getMaxIndex(arr) {
var max_idx = 0;
for(var i = 0; i < arr.length; i++) {
var current_elem = arr[i];
var max_elem = arr[max_idx];
if(current_elem > max_elem) {
max_idx = i;
}
}
return max_idx;
}
var nums = [1, 100, 2, -1];
console.log(getMaxIndex(nums)); // 1, because 100 is at index 1
现在您有了一个可以检索数组中最大数字的索引的方法,您可以使用.splice(index, 1)
删除该数字。这将从阵列中删除最大数目。然后,您可以使用新数组作为输入再次调用getMaxIndex()
,这将再次检索传递的数组中最大元素的索引。该索引将是原始数组中第二大数字的位置:
function getMaxIndex(arr) {
var max_idx = 0;
for(var i = 0; i < arr.length; i++) {
var current_elem = arr[i];
var max_elem = arr[max_idx];
if(current_elem > max_elem) {
max_idx = i;
}
}
return max_idx;
}
var nums = [1, 100, 2, -1];
var to_remove_idx = getMaxIndex(nums);
nums.splice(to_remove_idx, 1); // remove the index with the biggest number
var second_largest_idx = getMaxIndex(nums);
var second_largest = nums[second_largest_idx];
console.log(second_largest);
然后,您可以将在函数外部执行的逻辑封装为自己的函数。您可以对此进行概括,以便为数组中的nth
最大数字传递一个数字:
function getMaxIndex(arr) {
var max_idx = 0;
for (var i = 0; i < arr.length; i++) {
var current_elem = arr[i];
var max_elem = arr[max_idx];
if (current_elem > max_elem) {
max_idx = i;
}
}
return max_idx;
}
function getNthLargest(lst, n) {
var arr = lst.slice(); // copy array (so original passed in array is not modified)
for(var i = 0; i < n-1; i++) {
var to_remove_idx = getMaxIndex(arr);
arr.splice(to_remove_idx, 1); // remove the index with the biggest number
}
var n_index = getMaxIndex(arr);
var result = arr[n_index];
return result;
}
var nums = [1, 100, 2, -1];
console.log(getNthLargest(nums, 2));
注意:这种方法不是很有效。实际上,以降序对数组进行排序然后抓取nth-1
索引会更加有效。对于此类问题,最有效的方法很可能是使用Quickselect算法。
答案 2 :(得分:1)
尝试对数组降序排序并在索引1处获取项目
const arrayNumber = [89, 28, 22, 20, 41, 1, 39, 41, 67];
function findSecondLargestNumber (array) {
if(!array) return undefined;
return array.sort(function(a, b){return b-a})[1];
}
console.log(findSecondLargestNumber(arrayNumber))