將字串 "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⁵),會超時。優化見下文。
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;
j 是 up 陣列的下一個寫入位置。m=0, m > len, 全部高於/低於平均分。