当前位置: 首页 > news >正文

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

目录

方法一:双指针法 

方法二:辅助数组

方法对比总结:


问题定义

给定一个字符串,例如:

char str[] = "hello";

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

"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'

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"

LeftRightstr[left]str[right]After swap
04'h''o'o e l l h
13'e''l'o l l e h
22--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:求字符串长度

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)
http://www.dtcms.com/a/290903.html

相关文章:

  • 052_迭代器(Iterator / ListIterator)
  • HCL 三层知识总结
  • Java 二叉树
  • uniapp+vue3预约时间和日期
  • registry-ui docker搭建私有仓库的一些问题笔记
  • 在React中做过哪些性能优化?
  • java每日精进 7.21【Uel表达式和流程设计】
  • 【Elasticsearch】IndexModule
  • 【沧海拾昧】微分先行PID与中间微分反馈控制
  • 工业网关的应用场景
  • 【正常配置了beast扩展,phpinfo信息也显示了,但是就是不运行】
  • 前端-DOM
  • pandas 的series和dataframe的用法,六个题目
  • 141、环形链表
  • 前后端分离项目进阶1---后端
  • 果园里的温柔之手:Deepoc具身智能如何重塑采摘机器人的“生命感知”
  • Python day20 - 特征降维之奇异值分解
  • 【设计模式C#】工厂方法模式(相比简单工厂模式更加具有灵活性和扩展性的工厂模式)
  • git_guide
  • prometheus主动服务发现机制
  • 在 React 中实现全局防复制hooks
  • Java 解析前端上传 ZIP 压缩包内 Excel 文件的完整实现方案
  • Neo4j 5.x版本的导出与导入数据库
  • 易语言+懒人精灵/按键中控群控教程(手机、主板机、模拟器通用)
  • CFD总压边界条件的理解与开发处理
  • DM8数据库Docker镜像部署最佳实践
  • 自学鸿蒙测试day01-插件安装推荐
  • Vue 3 响应式原理详细解读【一】—— Proxy 如何突破 defineProperty 的局限
  • 计算机发展史:晶体管时代的技术飞跃
  • Boost库智能指针boost::shared_ptr详解和常用场景使用错误示例以及解决方法