目录
问题定义
给定一个字符串,例如:
cpp
char str[] = "hello";
我们的目标是把它反转成:
cpp
"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'
)
cpp
int len = 0;
while (str[len] != '\0') {
len++;
}
Step 2:初始化左右指针
cpp
int left = 0;
int right = len - 1;
Step 3:循环交换字符
cpp
while (left < right) {
char temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
完整代码实现
cpp
#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:求字符串长度
cpp
int len = 0;
while (str[len] != '\0') {
len++;
}
Step 2:创建新数组,反向拷贝字符
cpp
char rev[100]; // 足够大
for (int i = 0; i < len; i++) {
rev[i] = str[len - 1 - i];
}
Step 3:别忘了加终止符号 '\0'
cpp
rev[len] = '\0';
Step 4:把 rev 拷贝回原数组
cpp
for (int i = 0; i <= len; i++) {
str[i] = rev[i];
}
完整代码如下
cpp
#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 拷贝回原数组 str
for (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) |