題目假設:陣列非空、元素為非負整數、全數互不相同。目標:單次遍歷找出第二大值。提供兩種邏輯等價但寫法不同的實作,並分析邊界處理。
public static int getSecondMaxElem(int[] a) {
if (a == null || a.length <= 1) return -1;
int max = Math.max(a[0], a[1]);
int secMax = a[0] + a[1] - max; // 另一個值
for (int i = 2; i < a.length; i++) {
int cur = a[i];
if (cur > secMax) {
secMax = cur;
if (secMax > max) { // 同時更新 max
int tmp = secMax; secMax = max; max = tmp;
}
}
}
return secMax;
}
public static int getSecondMaxElem2(int[] a) {
if (a == null || a.length <= 1) return -1;
int max = Math.max(a[0], a[1]);
int secMax = a[0] + a[1] - max;
for (int i = 2; i < a.length; i++) {
int cur = a[i];
if (cur > max) {
secMax = max; // 舊 max 降為第二大
max = cur;
} else if (cur > secMax) { // cur 在 (secMax, max] 區間
secMax = cur;
}
// else cur <= secMax:無變化
}
return secMax;
}
int[] arr = {2, 3, 1, 6, 7, 5, 9};
// 排序後:1,2,3,5,6,7,9 → 第二大 = 7
System.out.println("算法1:" + getSecondMaxElem(arr)); // 7
System.out.println("算法2:" + getSecondMaxElem2(arr)); // 7
Set 或排序後跳過相等值。Comparator<T> 適用任意可比較物件。max=Integer.MIN_VALUE, secMax=Integer.MIN_VALUE 會導致全負數陣列錯誤(題目限非負整數故未現形)。ArrayIndexOutOfBoundsException。cur == max 或 cur == secMax(本題互不相同故安全,實務需考慮)。