数据结构:反转字符串(Reversing a String)

目录

方法一:双指针法

方法二:辅助数组

方法对比总结:


问题定义

给定一个字符串,例如:

cpp 复制代码
char str[] = "hello";

我们的目标是把它反转成:

cpp 复制代码
"olleh"

📌 输入特点:

  • 字符串用 char 数组表示(C风格字符串)

  • 最后一个字符是 '\0'(空字符),表示字符串结束

(可以参考类似问题:数据结构:数组:反转数组(Reverse the Array)-CSDN博客

方法一:双指针法

🧠 思路讲解:双指针对换法

我们从字符串两端出发,交换字符:

  1. 指针 left 指向开头(索引 0)

  2. 指针 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"


方法二:辅助数组

我们使用辅助数组,不直接在原数组中改动。

🧠 思路讲解(辅助数组方法)

  1. 首先求出原字符串长度(不包括 '\0');

  2. 创建一个新数组 rev[],长度为 len + 1,用于存放反转后的字符串;

  3. str[len - 1] 开始,把字符逐个写入 rev[0], rev[1], ..., rev[len - 1]

  4. 最后手动加上 rev[len] = '\0'

  5. 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)
相关推荐
风筝在晴天搁浅10 分钟前
hot100 239.滑动窗口最大值
数据结构·算法·leetcode
夏乌_Wx22 分钟前
练题100天——DAY31:相对名次+数组拆分+重塑矩阵
数据结构·算法
LYFlied22 分钟前
【算法解题模板】-解二叉树相关算法题的技巧
前端·数据结构·算法·leetcode
爱学习的小仙女!1 小时前
算法效率的度量 时间复杂度 空间复杂度
数据结构·算法
Trouvaille ~2 小时前
【C++篇】把混沌映射成秩序:哈希表的底层哲学与实现之道
数据结构·c++·stl·哈希算法·散列表·面向对象·基础入门
Yeats_Liao2 小时前
MindSpore开发之路(四):核心数据结构Tensor
数据结构·人工智能·机器学习
菜鸟233号3 小时前
力扣78 子集 java实现
java·数据结构·算法·leetcode
Han.miracle3 小时前
数据结构与算法--008四数之和 与经典子数组 / 子串问题解析
数据结构·算法
AI科技星3 小时前
圆柱螺旋运动方程的一步步求导与实验数据验证
开发语言·数据结构·经验分享·线性代数·算法·数学建模
月明长歌3 小时前
【码道初阶】【Leetcode94&144&145】二叉树的前中后序遍历(非递归版):显式调用栈的优雅实现
java·数据结构·windows·算法·leetcode·二叉树