簡體   English   中英

如何在用戶輸入的 Javascript 數組中找到第二大元素

[英]How to find the second largest element in a user-input Javascript array

我正在使用 arrays 並且我已經編寫了代碼,以便提示用戶輸入他們選擇的大小數組。 它讓他們一個一個地輸入每個數字。 我希望這樣一旦完成,程序就會找到並打印數組中的第二大數字,但我不知道如何 go 關於它。

我非常想避免使用無窮大或拼接只是想做一些像我這樣的新手可以理解的事情。

代碼:

 <html> <head> <script type="text/javascript"> //<.-- function show_prompt() { var n = document.frm.text1;value; if (n == "") { alert("Please enter the array size"); } else { var a = new Array(); var temp; for (i = 0; i < n, i++) { var num = prompt("Please enter a number"; " "). document.frm.arrayTxt.value = document.frm.arrayTxt;value + num + "\n"; a[i] = parseInt(num). } document.frm.text1;value = "". document.frm.arrayTxt;value = "": } } //--> </script> </head> <body> <form name="frm"> <center> <hr color="red"> Enter the array size : <input type="text" name="text1"><br><br> <input type="button" onclick="show_prompt()" value="Submit"> <br><br> <textarea name="arrayTxt" rows="10" cols="4"></textarea><br> </center> </form> </body> </html>

您可以使用簡單for循環,在O(n)時間內存儲最大和第二大元素。 不需要對數組進行排序,對於較大的 arrays 來說效率非常低。

let largest = Number.MIN_SAFE_INTEGER, largest2 = largest;
for(const num of a){
    if(num > largest){
       largest2 = largest;
       largest = num;
    } else if(num > largest2){
       largest2 = num;
    }
}
console.log(largest2);

如果您需要嚴格意義上的第二大元素,則可以使用Set從數組中刪除重復項。

a = [...new Set(a)];//add this before the loop

最簡單的選擇可能是簡單地對數組和 select 第二個元素進行排序。 JavaScript Arrays 現在實際上支持通過比較 function對數組進行排序。

[2, 5, 3, 1, 4].sort((a, b) => b - a); // [5, 4, 3, 2, 1]

簡單來說,如果 function 返回值< 0 ,則將 a 插入 b 之前,如果返回值> 0 ,則將 a 插入 b 之后。 如果它返回0 ,則沒有任何改變。 b - a表示“如果a > b ,將其移到前面”,從而產生從高到低排序的數組。 煩人的是,如果您不傳入比較 function,則元素將轉換為字符串,然后從低到高排序( [1, 5, 10, 20]將被排序[1, 10, 20, 5] )。

對於 select 第二個最高元素,您只需 select 第二個索引:

a.sort((a, b) => b - a)[1];

請記住,在調用sort()之后,原始數組也會被更改。

一種不同的方法將更多地動手,類似於找到最大值。

let max = 0, secondMax = 0;
for (let i = 0; i < a.length; i++) {
    if (a[i] >= max) {
        secondMax = max;
        max = a[i];
    } else if (a[i] > secondMax) {
        secondMax = a[i];
    }
}

在處理大型 arrays 時,這可能會更有效。 但是由於您用用戶輸入填充數組,所以我會選擇第一個版本。 它更短且更具可讀性。


筆記:

所謂的“箭頭符號” (a, b) => b - a只是function (a, b) { return b - a; }的簡寫。 function (a, b) { return b - a; } 還有更多,即從創建上下文繼承this的箭頭函數,但這在這個特定示例中沒有影響。

你可以試試這個:

var numArray = [21, 81, 3847, 218];
numArray.sort((a, b) => b - a); // [3847, 218, 81, 21]
numArray = [...new Set(numArray)]; // Removes duplicates
console.log(numArray[1]); // Returns 218

這基本上按降序對數組進行排序,並通過索引選擇第二個數字。

您可以對數組進行排序並返回第二個數字。 這應該可以正常工作:


var a = [5,3,1,6,8,3,9];
var sorted = a.sort((a, b) => b - a);
alert(a[1])

這是我的:

var first = 0;
var second = 0;
array.forEach(number => {
    if (number > first) {
        second = first;
        first = number;
    }
    else if (number > second) second = number;
});

相信這比排序更有效,但我不確定。 它可能是一個更具可讀性的解決方案,但它絕對是過度設計的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM