演算法:兩次反轉法
- 整體反轉字符串:
"i ma a tneduts"
- 逐個單詞反轉:
"i am a student"
代碼實現
#include <stdio.h>
#include <string.h>
void swap(char *a, char *b) { char t=*a; *a=*b; *b=t; }
void reverse(char *s, int l, int r) {
while (l < r) swap(&s[l++], &s[r--]);
}
int main() {
char str[] = "student a am i";
int len = strlen(str);
reverse(str, 0, len-1); // 整體反轉
int start = 0;
for (int i=0; i<=len; i++) {
if (str[i]==' ' || str[i]=='\0') {
reverse(str, start, i-1); // 單詞反轉
start = i+1;
}
}
printf("%s\n", str); // i am a student
return 0;
}
關鍵點
- 原地操作,空間 O(1)。
- 時間 O(n),兩次線性掃描。
- 處理多空格、前後空格需額外邏輯。