找出次大值

原來是這樣子操作!

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
let arr = [5, 8, 6]
let max = -Infinity
let max2 = -Infinity
for(let i=0; i<arr.length; i++) {
if (arr[i] > max) {
max2 = max
max = arr[i]
} else if (arr[i] > max2) {
max2 = arr[i]
}
}
console.log(max, max2)

還記得曾經的人體編譯器嗎:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1. 設 arr 為 [5, 8, 6]
2. 設 max 為 -Infinity
3. 設 max2 為 -Infinity
4. 進入迴圈,i 從 0 跑到 2
5. i 現在是 0
6. 判斷 arr[0] > max => (5 > -Infinity) =>
7. 把 max2 設為 max => max2 = -Infinity
8. 把 max 設為 arr[0] => max = 5
9. 下一圈迴圈
10. i 現在是 1
11. 判斷 arr[1] > max => (8 > 5) =>
12. 把 max2 設為 max => max2 = 5
13. 把 max 設為 arr[1] => max = 8
14. 下一圈迴圈
15. i 現在是 2
16. 判斷 arr[2] > max => (6 > 8) => 不是
17. 判斷 arr[2] > max2 => (6 > 5) =>
11. 把 max2 設為 arr[2] => max2 = 6
18. 下一圈迴圈
19. i 現在是 3,不符合條件,結束迴圈
20. 印出 max, max2 => 8, 6

解說

其實這一題的眉角在於「多用了一個變數來儲存次大值」。

每當 max 碰到比自己大的數字時,max2 會先把 max 的值給儲存起來,接著才把 max 的值給更新。

不過要特別注意的一個情況是:「arr[i] 沒有比 max 大,但卻比 max2 大」的情況,所以這個部分也要再多做一層判斷,才不會漏掉這個可能性。

mentor-program-day11 變數的命名哲學
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×