目錄
方法一:雙指針法?
方法二:輔助數組
方法對比總結:
問題定義
給定一個字符串,例如:
char str[] = "hello";
我們的目標是把它反轉成:
"olleh"
📌 輸入特點:
-
字符串用
char
數組表示(C風格字符串) -
最后一個字符是
'\0'
(空字符),表示字符串結束
(可以參考類似問題:數據結構:數組:反轉數組(Reverse the Array)-CSDN博客?)
方法一:雙指針法?
🧠 思路講解:雙指針對換法
我們從字符串兩端出發,交換字符:
-
指針
left
指向開頭(索引 0) -
指針
right
指向結尾(索引為length - 1
,排除'\0'
)
逐步交換:
-
str[left] ? str[right]
-
然后
left++
,right--
-
重復,直到
left >= right
?代碼實現
Step 1:計算字符串長度(不包括 '\0'
)
int len = 0;
while (str[len] != '\0') {len++;
}
Step 2:初始化左右指針
int left = 0;
int right = len - 1;
Step 3:循環交換字符
while (left < right) {char temp = str[left];str[left] = str[right];str[right] = temp;left++;right--;
}
完整代碼實現
#include <iostream>
using namespace std;void reverseString(char str[]) {// 計算長度int len = 0;while (str[len] != '\0') {len++;}// 雙指針交換字符int left = 0;int right = len - 1;while (left < right) {char temp = str[left];str[left] = str[right];str[right] = temp;left++;right--;}
}int main() {char str[] = "hello";cout << "原字符串: " << str << endl;reverseString(str);cout << "反轉后: " << str << endl;return 0;
}
示例演示
字符串 "hello"
:
Left | Right | str[left] | str[right] | After swap |
---|---|---|---|---|
0 | 4 | 'h' | 'o' | o e l l h |
1 | 3 | 'e' | 'l' | o l l e h |
2 | 2 | - | - | done |
結果:"olleh"
方法二:輔助數組
我們使用輔助數組,不直接在原數組中改動。?
🧠 思路講解(輔助數組方法)
-
首先求出原字符串長度(不包括
'\0'
); -
創建一個新數組
rev[]
,長度為len + 1
,用于存放反轉后的字符串; -
從
str[len - 1]
開始,把字符逐個寫入rev[0], rev[1], ..., rev[len - 1]
; -
最后手動加上
rev[len] = '\0'
; -
?將
rev
再復制回str
,或者直接用rev
輸出。
代碼實現
?Step 1:求字符串長度
int len = 0;
while (str[len] != '\0') {len++;
}
Step 2:創建新數組,反向拷貝字符
char rev[100]; // 足夠大for (int i = 0; i < len; i++) {rev[i] = str[len - 1 - i];
}
Step 3:別忘了加終止符號 '\0'
rev[len] = '\0';
Step 4:把 rev 拷貝回原數組
for (int i = 0; i <= len; i++) {str[i] = rev[i];
}
完整代碼如下
#include <iostream>
using namespace std;void reverseString(char str[]) {// Step 1: 求字符串長度int len = 0;while (str[len] != '\0') {len++;}// Step 2: 使用輔助數組從后往前復制char rev[100]; // 假設最多100個字符for (int i = 0; i < len; i++) {rev[i] = str[len - 1 - i];}// Step 3: 添加字符串終止符rev[len] = '\0';// Step 4: 將 rev 拷貝回原數組 strfor (int i = 0; i <= len; i++) {str[i] = rev[i];}
}int main() {char str[] = "hello";cout << "原字符串: " << str << endl;reverseString(str);cout << "反轉后: " << str << endl;return 0;
}
方法對比總結:
方法 | 說明 | 時間復雜度 | 空間復雜度 |
---|---|---|---|
方法①:原地交換 | 左右指針交換 | O(n) | O(1) |
方法②:輔助數組 | 用新數組逆序寫入 | O(n) | O(n) |