原地反轉字串(不配置額外記憶體),要求時間 O(N)、空間 O(1)、碼簡潔可讀。面試常見考點。
利用 a ^= b ^= a ^= b 無需暫存變數交換兩值。注意:C 標準中 a ^= b ^= a ^= b 為未定義行為(同一序列點多次修改),實務應拆分三句或用暫存變數。下列為安全寫法:
char *reverse_xor(char *str) {
size_t len = strlen(str);
for (size_t i = 0, j = len - 1; i < j; ++i, --j) {
str[i] ^= str[j];
str[j] ^= str[i];
str[i] ^= str[j];
}
return str;
}
最直觀、無未定義行為風險,編譯器優化後效能相同。
char *reverse_swap(char *str) {
size_t len = strlen(str);
for (size_t i = 0, j = len - 1; i < j; ++i, --j) {
char tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
return str;
}
char *reverse_single(char *str) {
size_t len = strlen(str);
for (size_t i = 0; i < len/2; ++i) {
char tmp = str[i];
str[i] = str[len-1-i];
str[len-1-i] = tmp;
}
return str;
}
| 方法 | 時間 | 空間 | 可讀性 | 風險 |
|---|---|---|---|---|
| 異或法 | O(N) | O(1) | 中(需理解位運算) | 寫成單行表達式屬 UB |
| 雙指標對調 | O(N) | O(1) | 高 | 無 |
| 單指標對調 | O(N) | O(1) | 高 | 無 |
標準庫 strrev | O(N) | O(1) | 最高 | 非標準,Windows 專有 |
std::reverse(begin, end)。const 不可修改。int main() {
char s1[] = "hello";
char s2[] = "world";
printf("xor: %s\n", reverse_xor(s1));
printf("swap: %s\n", reverse_swap(s2));
return 0;
}