数组中第二大的数

3

我只是想做这个简单的事情(创建一个数字数组,然后获取同一数组中第二大的数字),但我不明白为什么它不能将选定的数字从一个数组推送到第二个数组中(应从中打印出第二大的数字)。

var cisla = [];
var i = 0;

for(var i=0; i<5; i++){
    var x = prompt("Put " + (i+1) + ". number");
    cisla[i] = x;
}

var p = document.createElement("p");
p.innerHTML = "Your array: " + cisla;
document.getElementsByTagName("body")[0].appendChild(p);

var najvacsie;
var index;
var cisla2 = [];
var dlzka = cisla.length;

while(i<dlzka){
    najvacsie = cisla[0];
    for(var x=0; x<cisla.length; x++){
        if(najvacsie < cisla[x]){
            najvacsie = cisla[x];
            index = cisla.indexOf(najvacsie);
        }
    }
    cisla2.push(najvacsie);
    cisla.splice(index, 1);
    i++;
}

var pp = document.createElement("p");
pp.innerHTML = "Ordered array: " +cisla2;
document.getElementsByTagName("body")[0].appendChild(pp);

var ppp = document.createElement("p");
ppp.innerHTML = "The 2nd biggest number of your array is: " + cisla2[1];
document.getElementsByTagName("body")[0].appendChild(ppp);

谢谢你的回答。

2
在你的 while 循环之前添加 i = 0; - Prerak Sola
1
使用 Array.prototype.sort() 不是更方便吗? - Nina Scholz
使用排序而不是显而易见的 O(n) 的解决方案可能更容易,但这相当过分。 - Jordan Running
2个回答

2
我做了一些修改,请查看注释。
但是为了向您展示您代码中的主要问题:
if (najvacsie < cisla[x]){
    najvacsie = cisla[x];
    index = cisla.indexOf(najvacsie);
}

问题在于,如果你的najvacsie已经有了最大值,则索引永远不会被设置,因此下一个...
cisla.splice(index, 1);

如果最后一个值未定义,则使用0作为拼接值,否则将其与最后一个值拼接(在第一轮中,这可能是预期行为)。

现在这里是工作模型:

var array = [];

for (var i = 0; i < 5; i++) {
    var x = prompt("Put " + (i + 1) + ". number");
    array[i] = parseInt(x, 10); // otherwise it will sorted by string
}

var p = document.createElement("p");
p.innerHTML = "Your array: " + array;
document.getElementsByTagName("body")[0].appendChild(p);

var tempValue;
var index;
var orderedArray = [];

while (array.length) { // that is shorter
    tempValue = array[0];
    for (var x = 0; x < array.length; x++) {
        if (tempValue < array[x]) {
            tempValue = array[x];
        }
    }
    index = array.indexOf(tempValue); // move this here
    orderedArray.push(tempValue);
    array.splice(index, 1);
}

//orderedArray = array.slice(0).sort().reverse(); // that may be better ...
var pp = document.createElement("p");
pp.innerHTML = "Ordered array: " + orderedArray;
document.getElementsByTagName("body")[0].appendChild(pp);

var ppp = document.createElement("p");
ppp.innerHTML = "The 2nd biggest number of your array is: " + orderedArray[1];
document.getElementsByTagName("body")[0].appendChild(ppp);


0

你可以在线性时间内完成它(我稍后会尝试想出一种通用的方法)

function secondBiggestOf(array) {
    var biggest = -Infinity;
    var secondBiggest = -Infinity;

    for (var i = 0, l = array.length; i < l; i++) {
       var current = array[i];

       if (biggest < current) {
           var tmp = biggest;
           biggest = array[i];

           if (secondBiggest !== -Infinity) {
               secondBiggest = tmp;
           }
       } else if (secondBiggest < current) {
           secondBiggest = current;
       }
    }
    return secondBiggest;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接