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

C 語言字串旋轉與學生成績統計:經典填空題詳細解析

     編輯:C 語言問答

題目一:字串左旋轉 (移動前 m 個字符到末尾)

問題

將字串 "ABCDEFGHIJK" 左旋 3 位 → "DEFGHIJKABC"。填空實現 fun(char *w, int m)。

核心邏輯:單字符循環移動

執行 m 次:取首字符暫存,餘下字符前移一位,首字符放到末尾。

填空答案


void fun(char *w, int m) {
    int i, j;
    char t;
    for (i = 1; i <= m; i++) {       // 外層循環 m 次
        t = w[0];                    // 1. 暫存首字符
        for (j = 1; w[j] != '\0'; j++) { // 2. 內層前移
            w[j-1] = w[j];           // 【空1】w[j-1] = w[j];
        }
        w[j-1] = t;                  // 【空2】w[j-1] = t; (j 指向 '\0',j-1 是末尾)
    }                                // 【空3】} 結束外層 for
}

時間複雜度

O(m × n)。若 m、n 較大 (如 10⁵),會超時。優化見下文。

優化版:三次反轉法 (O(n))


void reverse(char *s, int l, int r) { // 反轉 s[l..r]
    while (l < r) { char t = s[l]; s[l] = s[r]; s[r] = t; l++; r--; }
}

void fun_opt(char *w, int m) {
    int len = strlen(w);
    m %= len; // 處理 m > len
    reverse(w, 0, m - 1);       // 反轉前 m
    reverse(w, m, len - 1);     // 反轉後 len-m
    reverse(w, 0, len - 1);     // 整體反轉
}
// "ABCDEFGHIJK", m=3
// 1. "CBADEFGHIJK"
// 2. "CBAKJIHGFED"
// 3. "DEFGHIJKABC" ✓

題目二:統計高於平均分人數與分數

問題

輸入分數陣列,計算平均分,將高於平均分的分數存入 up 陣列,返回人數。

填空答案


int fun(int score[], int m, int up[]) {
    int i, j = 0;
    float av = 0.0;
    for (i = 0; i < m; i++)
        av = av + score[i] / m; // 累加平均 (注意:逐項除以 m 避免溢出,但精度稍差)
    
    for (i = 0; i < m; i++) {
        if (score[i] > av) {    // 【空1】if (score[i] > av)
            up[j++] = score[i]; // 【空2】up[j++] = score[i];
        }
    }                           // 【空3】} (結束 for)
    return j;                   // 返回高於平均分的人數
}

平均分計算改進


// 較佳:先求和再除 (精度更高,注意長整型防溢出)
long long sum = 0;
for (i = 0; i < m; i++) sum += score[i];
float av = (float)sum / m;

考試填空技巧總結

  1. 先讀懂主函數調用方式:觀察參數傳遞 (陣列退化為指標、輸出參數)。
  2. 分析迴圈不變量:j 是 up 陣列的下一個寫入位置。
  3. 邊界條件:m=0, m > len, 全部高於/低於平均分。
  4. 草稿紙手動跑測試案例:如題目給出的 24,35,88... 驗證邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved