当前位置: 首页 > 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.lryc.cn/news/594802.html

相关文章:

  • 无人机避障雷达模式运行方式
  • PHP面向对象高级特性:魔术方法、对象迭代器与设计模式应用
  • dolphinscheduler中sqoop无法执行
  • 三款适合户外探险、应急救援的智能三防手机,各有各的优势
  • SQLite以及Room框架的学习:用SQLite给新闻app加上更完善的登录注册功能
  • 深入浅出:从最小核心到完整架构,全面解析5G用户面协议栈
  • Mac上安装Claude Code的步骤
  • RANsemi 推出适用于 Split 7.2 Open RAN 无线电单元的即插即用基带板
  • Q10900H6迷你电脑:集成双10G+四2.5G网口,支持多系统网络部署
  • RNS805 是针对 O-RAN 联盟兼容 Cat A O-RU 优化的 SoC,符合 3GPP 5G/4G 标准。
  • 【Android】交叉编译faiss库 | 问题解决
  • 区块链之以太坊合约开发工具——Metamask钱包和Remix IDE
  • 部署Zabbix企业级分布式监控
  • 【Elasticsearch】settings
  • Webpack源代码泄露漏洞
  • 深圳南柯电子|发电机控制器EMC整改:从合规到高可靠的进化之路
  • Linux中ELF区域与文件偏移量的关系
  • 开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机
  • 一个适合MCU的分级菜单框架
  • 格式工厂5.21.0简介
  • 设计模式六:工厂模式(Factory Pattern)
  • 从安装到上手:Ubuntu 22.04 玩转 Containerd 2.1.3 容器运行时
  • 在 Windows上用WSL和VSCode进行Linux开发环境配置
  • 《使用 IDEA 部署 Docker 应用指南》
  • 在Anolis8.6上源码编译安装部署OpenVAS(GVM)未完待续
  • git bash命令不够完善,想整合msys2该怎么办?
  • Dynamics 365 Contact Center是什么
  • Java 解析前端上传 ZIP 压缩包内 Excel 文件的完整实现方案
  • 前端开发者快速理解Spring Boot项目指南
  • 在 Angular 应用程序中使用 Genkit 的完整指南