首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語法百題精解:從 n 個數中找最大值(陣列遍歷與邊界處理)

     編輯:關於C語言

題目描述

輸入 n(1 ≤ n ≤ 200)與 n 個整數,輸出最大值。輸入範例:4 1 2 3 4 → 輸出 4。

標準解法:單次遍歷 O(n)

#include 
#define MAX_N 200

int main() {
    int n, a[MAX_N];
    if (scanf("%d", &n) != 1 || n <= 0 || n > MAX_N) return 1;
    
    int max_val;
    scanf("%d", &max_val); // 讀第一個數初始化最大值
    for (int i = 1; i < n; ++i) {
        int x; scanf("%d", &x);
        if (x > max_val) max_val = x;
    }
    printf("%d\n", max_val);
    return 0;
}

關鍵點解析

  1. 邊界檢查:n 合法性驗證,防止陣列越界。
  2. 初始化策略:讀首個元素作為初始最大值,**避免假設數值範圍**(如 -32768 可能非最小)。
  3. 單次掃描:時間 O(n),空間 O(1)(若不存陣列可進一步優化為 O(1) 空間)。
  4. 輸入處理:scanf 回傳值檢查,防止格式錯誤導致未定義行為。

進階優化:不存陣列,串流處理

int main() {
    int n, x, max_val;
    if (scanf("%d %d", &n, &max_val) != 2) return 1;
    for (int i = 1; i < n; ++i) {
        if (scanf("%d", &x) != 1) break;
        if (x > max_val) max_val = x;
    }
    printf("%d\n", max_val);
    return 0;
}

空間複雜度降為 O(1),適合超大 n 或管道串流輸入。

常見錯誤與避坑

錯誤代碼問題修正
int max = 0;若全為負數,結果錯誤用首元素初始化
for(i=0;i<=n;i++)多讀一個數,越界i < n
scanf("%d", a);缺 &,傳值而非址&a[i]
無 scanf 回傳檢查輸入異常時未定義行為檢查回傳值

擴展變體

  • 求前 k 大:最小堆維護大小 k,O(n log k)。
  • 並行求最大值:OpenMP #pragma omp parallel for reduction(max:max_val)。
  • SIMD 向量化:_mm_max_epi32 等內建函數,4/8 元素並行比較。

總結

「從 n 個數找最大值」是陣列遍歷、邊界處理、輸入驗證、初始化策略的綜合考驗。掌握首元素初始化、單次掃描、輸入檢查、空間優化四大核心技巧,即可應對所有變體。面試時主動說明「為什麼不初始化為 0/INT_MIN」展現工程思維。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved