問題:輸入一組整數(≤20 個,以 0 結束),包含正負數,至少 2 個數。輸出第二大值。注意:最大值可能重複,第二大值定義為嚴格小於最大值的最大值。
5 5 3 排序後倒二仍為 5)。#include <stdio.h>
#include <limits.h>
int main() {
int x, max1 = INT_MIN, max2 = INT_MIN;
while (scanf("%d", &x) == 1 && x != 0) {
if (x > max1) {
max2 = max1;
max1 = x;
} else if (x > max2 && x < max1) { // 關鍵:嚴格小於 max1
max2 = x;
}
}
printf("%d\n", max2);
return 0;
}
輸入:5 8 -12 7 0 過程: 5 → max1=5, max2=MIN 8 → max1=8, max2=5 -12 → 無變化 7 → max2=7 (7<8) 輸出:7 ✓
| 輸入 | max1 | max2 | 說明 |
|---|---|---|---|
| 5 5 3 0 | 5 | 3 | 最大值重複,第二大為 3 |
| -5 -3 -3 0 | -3 | -5 | 負數場景 |
| 10 10 10 0 | 10 | INT_MIN | 無第二大值(題目保證至少兩個不同值) |
x > max2 && x < max1 精確排除等於最大值的情況。此題考察對「第二大」定義的精確理解與變量維護技巧,是基礎算法面試必考點。