C++中的字符串翻转算法解析

个人主页:[PingdiGuo_guo]

收录专栏:[C++干货专栏]

大家好,今天我们来学一下C++里的一个知识:字符串翻转。

目录

1.题目

描述

输入描述

输出描述

输入数据 1

输出数据 1

提示

2.解决题目

1.所需知识点

2.算法分析

1. 拼接新字符串法

2. 双指针法

3.用处

4.练习

5.总结


1.题目

单词翻转

描述

给出一个由若干个单词组成的句子,单词之间会有一个空格,请你反转这个句子。

输入描述

一行,包含一个由若干个单词组成的句子,单词总数不超过100,每个单词长度不超过10,仅由小写字母组成。

输出描述

一行字符串,表示反转后的句子。

输入数据 1

wc is dog

输出数据 1

god si cw

提示

输出时每行末尾的多余空格,不影响答案正确性。

2.解决题目

1.所需知识点

1. 字符串的遍历

2. 字符串的长度获取

3. 字符串的拼接

前三个知识点可参考【C++字符串详解】

4. 双指针法

双指针法,也叫快慢指针法,是一种常用的处理数组或链表的技巧。在C++中,可以使用指针或迭代器来实现双指针法。下面是一个示例代码,展示了如何使用双指针法在数组中查找目标值:
 

#include <iostream>
#include <vector>int main() {std::vector<int> nums = {1, 2, 3, 4, 5};int target = 3;int left = 0; // 左指针int right = nums.size() - 1; // 右指针while (left <= right) {// 找到目标值if (nums[left] == target || nums[right] == target) {std::cout << "Target found!" << std::endl;break;}left++; // 左指针向右移动right--; // 右指针向左移动}if (left > right) {std::cout << "Target not found." << std::endl;}return 0;
}

在这个示例中,我们定义了一个包含一些整数的向量nums,并定义了一个目标值target。我们使用两个指针left和right分别指向数组的首尾元素。然后,我们使用一个while循环,不断向中间移动两个指针。如果找到目标值,则输出"Target found!",并跳出循环。如果左指针超过了右指针,说明目标值不在数组中,输出"Target not found."。

这个示例只是演示了双指针法的基本用法,实际应用中可能会有更复杂的问题和处理逻辑。使用双指针法可以有效地提高程序的运行效率。

2.算法分析

字符串翻转是一个常见的编程问题,在C++中有多种方法来解决这个问题。在本文中,我们将讨论两种常用的算法:拼接新字符串法和双指针法。

1. 拼接新字符串法

初始思路是创建一个新的字符串,并从原字符串的最后一个字符开始,逐个将其拼接到新字符串中,直到拼接完成整个原字符串。

算法步骤:
- 创建一个空字符串 reversedStr用于存储翻转后的结果。
- 从原字符串的最后一个字符开始,遍历到第一个字符。
- 每次遍历,将当前字符拼接到 reversedStr字符串的末尾。
- 返回reversedStr字符串作为翻转后的结果。

​
#include <iostream>
#include <string>std::string reverseString(std::string str) {std::string reversedStr;for (int i = str.length() - 1; i >= 0; i--) {reversedStr += str[i];}return reversedStr;
}int main() {std::string str ;std::getline(std::cin,str);std::string reversedStr = reverseString(str);std::cout <<reversedStr << std::endl;return 0;
}​​​​
​​​​

该方法的时间复杂度为O(n),其中n为字符串的长度。在循环中,我们通过下标从最后一个字符开始遍历原字符串,并使用操作符+=将字符拼接到新字符串中。这种方法的缺点是需要额外的空间来存储新字符串,并且每次拼接字符都会导致内存重新分配,效率较低。

2. 双指针法

改进思路是使用双指针法来减少时间复杂度。具体思路是使用两个指针,一个指向字符串的开头,另一个指向字符串的末尾,不断交换两个指针指向的字符,直到两个指针相遇。

算法步骤:
- 创建一个与原字符串相同的字符串 reversedStr作为结果字符串。
- 使用两个指针 left 和 right,分别指向字符串的开头和末尾。
- 循环交换 left 和 right 指向的字符,然后 left 向右移动一位, right 向左移动一位,直到 left 和 right 相遇。
- 返回 reversedStr 字符串作为翻转后的结果。
 

​
​
​
#include <iostream>
#include <string>std::string reverseString(std::string str) {std::string reversedStr = str;int left = 0;int right = str.length() - 1;while (left < right) {std::swap(reversedStr[left], reversedStr[right]);left++;right--;}return reversedStr;
}int main() {std::string str ;std::getline(std::cin,str);std::string reversedStr = reverseString(str);std::cout << reversedStr << std::endl;return 0;
}​​​

该方法的时间复杂度为O(n/2),也就是O(n),其中n为字符串的长度。通过原地交换字符的方式,避免了额外的空间开销,同时减少了字符串操作的次数,提高了算法的效率,同时,代码简洁度也获得了提高。

3.用处

字符串翻转在C++中有许多实际应用,下面列举了几个常见的用途:

1. 判断回文字符串:字符串翻转可以用于判断一个字符串是否为回文字符串。回文字符串是指正读和反读都相同的字符串,比如"level"和"radar"。可以将字符串翻转后与原来的字符串进行比较,如果相同则是回文字符串。

2. 字符串反转:有时候需要将字符串的字符顺序反转。比如将字符串"hello"翻转为"olleh"。可以使用字符串翻转算法将字符串的字符顺序反转。

3. 字符串拼接或反转拼接:字符串翻转可以与字符串拼接操作结合使用,以实现一些特定的功能。比如将两个字符串拼接在一起,可以先将其中一个字符串进行翻转,然后再进行拼接。

4. 字符串匹配:字符串翻转也可以用于字符串匹配算法中。一些字符串匹配算法,如KMP算法,可以使用字符串翻转来加快匹配的效率。

总之,字符串翻转在C++中有很多实际应用,能够处理字符串相关的问题。在实际编程中,根据具体需求选择合适的字符串翻转方法,可以提高程序的效率和逻辑清晰度。

4.练习

判断一个字符串是否为回文字符串

解决方案:可以先将字符串进行反转,然后与原字符串进行比较,如果相同则是回文字符串。

#include <iostream>
#include <string>bool isPalindrome(const std::string& s) {std::string reversed = reverseString(s);return s == reversed;
}int main() {std::string s ;std::getline(std::cin,s);bool isPalin = isPalindrome(s);std::cout << isPalin << std::endl; // 输出 1 (true)return 0;
}

5.总结

本文对C++中的字符串翻转算法进行了解析,了解了字符串的遍历、长度获取、拼接等操作,以及掌握双指针法的使用,对解决字符串翻转问题很有帮助。本篇博客到此就结束了,感谢大家的支持与观看,如果有好的建议欢迎留言喔,谢谢大家啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

演讲回顾:如何为大规模研发团队加速CI构建,实现高效流水线

近日&#xff0c;龙智联合Atlassian举办的DevSecOps研讨会年终专场”趋势展望与实战探讨&#xff1a;如何打好DevOps基础、赋能创新”在上海圆满落幕。龙智Atlassian技术与顾问咨询团队&#xff0c;以及清晖、JamaSoftware、CloudBees等生态伙伴的嘉宾发表了主题演讲&#xff0…

LLM App SDK:LangChain vs. LlamaIndex

在Why RAG is big中&#xff0c;我表示支持检索增强生成&#xff08;RAG&#xff09;作为私有、离线、去中心化 LLM 应用程序的关键技术。 当你建造一些东西供自己使用时&#xff0c;你就是在孤军奋战。 你可以从头开始构建&#xff0c;但在现有框架上构建会更有效。 NSDT工具推…

Java多线程--避免同步机制带来的死锁问题及用Lock锁解决线程安全问题

文章目录 一、死锁&#xff08;1&#xff09;说明&#xff08;2&#xff09;案例1、案例12、案例23、案例3 &#xff08;3&#xff09;诱发死锁的原因及解决方案1、诱发死锁的原因2、避免死锁 二、JDK5.0新特性&#xff1a;Lock(锁)&#xff08;1&#xff09;介绍&#xff08;2…

小白水平理解面试经典题目_数组类LeetCode 118 Pascal‘s Triangle【回归解法】

LeetCode 118 生成杨辉三角&#xff08;Pascal’s Triangle&#xff09; 小白渣翻译 给定一个非负整数 numRows&#xff0c;生成杨辉三角的前 numRows 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 例子 这里是小白理解 那么这种题目一上来看&#xf…

4-树-合并两个有序链表

这是树的第4篇算法&#xff0c;力扣链接。 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xf…

Linux下gcc的使用与程序的翻译

gcc和程序的翻译过程 gcc介绍程序的翻译过程预编译编译汇编链接 命令行式宏定义 gcc介绍 gcc是一款编译C语言编译器&#xff0c;可以把我们用vim写的代码编译成可执行程序。编译C用g进行编译&#xff0c;C的文件后缀是test.cc或test.cpp或test.cxx 如果要安装g就执行以下命令 …

C# winform 多语言(json)方式实现

前后对比 使用nuget json工具包1.总体思路 创建对应的json字典对照表 { "测试":"Test", "语言":"Language", "设置":"Set", "中文(默认)":"Chinese (default)", "英文":"E…

【HarmonyOS应用开发】ArkTS 属性动画的使用(十二)

一、概述 属性动画&#xff0c;是最为基础的动画&#xff0c;其功能强大、使用场景多&#xff0c;应用范围较广。常用于如下场景中&#xff1a; 一、页面布局发生变化。例如添加、删除部分组件元素。二、页面元素的可见性和位置发生变化。例如显示或者隐藏部分元素&#xff0…

CANoe学习笔记——窗口类型

CANoe中的窗口类型&#xff0c;共分为三种 1&#xff1a;MDI windows 2&#xff1a;Standard Windows 3&#xff1a;Docking Windows 窗口有多种类型&#xff0c;每种类型都定义了特定的窗口行为。通过点击窗口顶部的区域&#xff0c;可以更改窗口类型。 如下图&#xff0…

Python的requests库与HTTP代理的使用:魔法般的网络探险之旅

嘿&#xff0c;各位魔法探险家们&#xff01;今天我们要一起探索Python的requests库与HTTP代理的神奇组合&#xff0c;开启一段魔法般的网络探险之旅&#xff01; 首先&#xff0c;我们要明白什么是requests库。简单说&#xff0c;requests库就是Python中的魔法飞毯&#xff0…

Linux基础知识合集

整理了一下学习的一些关于Linux的一些基础知识&#xff0c;同学们也可以通过公众号菜单栏查看&#xff01; 一、基础知识 Linux基础知识 Linux命令行基础学习 Linux用户与组概念初识 Linux文件与目录权限基础 Linux中文件内容的查看 Linux系统之计划任务管理 二、服务器管理 Vm…

MySql主从同步,同步SQL_ERROR 1032解决办法

1.登录从库 mysql -u root -p 2.输入命令查看状态 SHOW SLAVE STATUS\G; 3.找到对应的错误数据位置 Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB: app_push_centerReplicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Tabl…

“欢天喜地迎新春”下姜村邻里守望写对联活动

卯兔追冬去&#xff0c;辰龙报春来。空谷幽香谱佳期&#xff0c;红联金句寄吉祥。春联是我国特有的文学形式&#xff0c;贴春联是继承传统习俗的一种方式&#xff0c;是对祖先的尊敬&#xff0c;对传统的继承。春节前夕&#xff0c;家家户户贴上红红的春联&#xff0c;一副副透…

西圣Olite开放式耳机持续100+天霸榜:品质优势再掀数码狂潮

随着开放式耳机的市场竞争加剧&#xff0c;用户对耳机的音质和配置要求越来越高。而西圣开放式耳机的不断推陈出新&#xff0c;正是对客户需求的完美回应&#xff01;西圣开放式耳机&#xff0c;在现在鱼龙混杂的市场上&#xff0c;能够获得着卓越的研发成果并且还在不断的追求…

qt学习:停车场管理系统+摄像头+http识别车牌+sqlite3数据库

目录 参考前面发的几篇文章http识别车牌&#xff0c;sqlite3数据库、摄像头的文章 步骤 部分代码 新建一个项目&#xff0c;加入前面用到的http和image两个文件&#xff0c;和加入用到的模块和头函数和成员&#xff0c;加入前面用到的全局变量 配置ui界面 在构造函数中初…

Qt5 基于OpenGL实现六轴机械臂三维仿真

需求 在Qt中通过OPenGL方式加载三维模型STL文件&#xff0c;然后将多个结构的STL文件类型的模型进行组装&#xff0c;形成6轴机械臂三维模型的显示&#xff0c;并且可以对每个关节进行关节角度的控制。 新建一个C类STLFileLoader&#xff0c;用于加载STL文件&#xff0c;并进…

IP协议(2) 和 数据链路层协议基础

IP协议续 1.路由选择 在复杂的网络结构中,我们需要找到一个通往终点的路线,这就是路由选择 举个例子:我们在没有手机导航之前,想去一个地方得是到一个地方问一下路的方式最终找到目的地 路由的过程,其实就是样子问路的过程 1.当IP数据包到达路由器的时候,会查看目的IP 2.路由器…

Jmeter高级使用

文章目录 JMeter之计数器JMeter之集合点JMeter之断言JMeter之动态关联后置处理器&#xff1a;正则表达式提取器 JMeter之分布式测试JMeter之组件执行顺序元件的作用域元件的执行顺序配置元件Http Cookie管理器 多协议接口的性能测试Debug采样器Http请求中文乱码的解决Post参数设…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起…

Java_简单模拟实现ArrayList_学习ArrayList

文章目录 一、 了解线性表和顺序表区别1.线性表2.顺序表 二、模拟实现1.定义接口2.定义MyArrayList3.成员变量以及构造方法4.实现打印数组5.实现add方法6.实现查找某个数是否存在contains或者某个数的下标indexOf7.获取或更改pos位置的值 get和set8.获取数组大小 size9.删除某个…