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

news2024/10/5 13:46:38

个人主页:[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.coloradmin.cn/o/1426946.html

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

相关文章

【PostgresSQL系列】 ltree简介及基于SpringBoot实现 ltree数据增删改查

本文将对PostgresSQL中的ltree进行相关概念介绍&#xff0c;并以示例代码讲解ltree数据增删改查功能的实现。 作者&#xff1a;后端小肥肠 目录 1.前言 2. 基础概念 2.1. ltree 2.2. lquery 2.3. ltxtquery 2.4. ltree函数及操作符 2.4.1. ltree函数 2.4.2. ltree操作符…

AJAX-认识URL

定义 概念&#xff1a;URL就是统一资源定位符&#xff0c;简称网址&#xff0c;用于访问网络上的资源 组成 协议 http协议&#xff1a;超文本传输协议&#xff0c;规定浏览器和服务器之间传输数据的格式 协议范围&#xff1a;http,https,... 域名 域名&#xff1a;标记服务…

2024年美赛数学建模F题思路分析 - 减少非法野生动物贸易

# 1 赛题 问题F&#xff1a;减少非法野生动物贸易 非法的野生动物贸易会对我们的环境产生负面影响&#xff0c;并威胁到全球的生物多样性。据估计&#xff0c;它每年涉及高达265亿美元&#xff0c;被认为是全球第四大非法交易。[1]你将开发一个由数据驱动的5年项目&#xff0c…

一键部署自己的chatgpt4

效果 安装 docker pull hlohaus789/g4f docker run -d -p 10036:8080 -p 1337:1337 -p 7900:7900 --shm-size"2g" hlohaus789/g4f:latest镜像比较大,大约1.82G 使用 浏览器打开 http://192.168.168.111:10036/ 愉快地使用吧

使用Python的Turtle模块简单绘制烟花效果

import turtle import random# 初始化屏幕 screen turtle.Screen() screen.bgcolor("black") screen.title("烟花模拟")# 创建一个Turtle来绘制烟花 firework turtle.Turtle() firework.hideturtle() firework.speed(0) # 设置绘图速度为最快# 绘制烟花…

nrm切换镜像源-yarn不生效问题

在说这问题前&#xff0c;大家肯定知道nvn管理node版本&#xff0c;不懂的朋友直接看此文&#xff1a; nvm - nodejs版本管理工具&#xff1a;https://blog.csdn.net/tianlu930/article/details/135988727 要安装node自带npm其实不好用&#xff0c;一般都用再装yarn&#xff0c…

gtkmm xml ui 例子(from string)

文章目录 前言来看一个从字符串中生成UI的例子 前言 glade生成的xml格式不被gtkmm4支持, 需要作修改 来看一个从字符串中生成UI的例子 #include <gtkmm/application.h> #include <gtkmm.h> #include <iostream> using namespace std;class ExampleWindow :…

Redis的bitmap使用不当,我内存爆了

背景 最近发现Redis的内存持续暴涨&#xff0c; 涨的有点吓人&#xff0c;机器都快扛不住了&#xff0c;不得不进行Redis内存可视化分析&#xff0c;发现大量的String类型的大key 经分析&#xff0c;最近上线了页面UV的统计&#xff0c;那目前如何做的呢&#xff1f; 通过访…

151基于matlab的齿轮-轴-轴承系统的含间隙非线性动力学模型

基于matlab的齿轮-轴-轴承系统的含间隙非线性动力学模型&#xff0c;根据牛顿第二定律&#xff0c;建立齿轮系统啮合的非线性动力学方程&#xff0c;同时也主要应用修正Capone模型的滑动轴承无量纲化雷诺方程&#xff0c;利用这些方程推到公式建模&#xff1b;用MATLAB求解画出…

Python中使用HTTP代理进行网络请求:轻松玩转网络世界的“魔法门“

嘿&#xff0c;小伙伴们&#xff01;今天我们来聊一聊Python中一个超级有用的功能——使用HTTP代理进行网络请求。这不是在念咒语&#xff0c;而是开启网络世界的"魔法门"。 首先&#xff0c;让我们了解一下什么是HTTP代理。简单来说&#xff0c;HTTP代理就是一个中…

影响计算机性能的前10大因素,看你到底关注了几个

计算机性能被定义为计算机系统在给定时间内完成的有价值的工作量。它是根据执行程序或指令的效率、准确性和速度来估计的。因此,当你想知道为什么你的设备速度慢,而其他时候它一直在有效工作时,有几个因素可能会导致这个问题。 其中一些包括CPU、RAM大小、硬盘空间、速度、…

OJ刷题:《剑指offer》之左旋字符串!

目录 1.题目描述 2.方法一&#xff08;元素一一挪&#xff09; 2.1算法解析 2.2代码实现 3.方法二&#xff08;三次逆置&#xff09; 3.1算法解析 3.2代码实现 4.方法三&#xff08;库方法&#xff09; 4.1算法解析 4.2代码实现 5.完结散花 创作不易&#xff0c;宝子…

做研究系列:快速总结大量研究论文的成果

快速总结大量研究论文的成果时&#xff0c;可以遵循以下步骤和策略来提高效率并确保准确性&#xff1a; 系统性筛选与阅读摘要&#xff1a; 首先根据研究主题或关键词筛选出相关论文。快速阅读每篇论文的摘要&#xff0c;了解其主要目的、方法、关键结果和结论。 构建大纲与分类…

EtherCAT FP介绍系列文章—UDP gateway

EtherCAT主站上的Mailbox Gateway功能&#xff0c;可以用于将EtherCAT mailbox相关协议从外部设备的工具通过邮箱网关路由到EtherCAT从站设备。在EtherCAT规范中定义的所有邮箱协议在此功能中都可用&#xff0c;例如CoE, FoE, VoE, SoE。 但是&#xff0c;这里特别注意的是Mai…

Elasticsearch-内存结构

ElasticSearch的内存从大的结构可以分堆内存&#xff08;On Heap&#xff09;和堆外内存&#xff08;Off Heap&#xff09;。Off Heap部分由Lucene进行管理。On Heap部分存在可GC部分和不可GC部分&#xff0c;可GC部分通过GC回收垃圾对象&#xff0c;从而释放内存。不可GC部分不…

英码科技携手昇腾共建算力底座:推出EA500I超强AI处理能力边缘计算盒子!

在数字经济浪潮中&#xff0c;算力已成为不可或缺的驱动力&#xff0c;为各行各业的数字化转型提供了强大的推动力。面对多元化和供需不平衡的挑战&#xff0c;需要实现从理论架构到软硬件实现的质的飞跃&#xff0c;以满足持续增长的算力需求&#xff0c;华为昇腾在这一方面展…

基于JAVA和Vue的宠物医院诊所商城论坛管理系统

摘要&#xff1a; 随着人们生活水平的提高&#xff0c;宠物逐渐成为家庭中不可或缺的成员。伴随着宠物行业的迅猛发展&#xff0c;宠物医疗服务需求也日益增长&#xff0c;传统的宠物医院管理模式已无法满足现代化、信息化的管理需求。因此&#xff0c;开发一款高效、智能的宠物…

ElasticSearch-IK分词器(elasticsearch插件)安装配置和ElasticSearch的Rest命令测试

四、IK分词器(elasticsearch插件) IK分词器&#xff1a;中文分词器 分词&#xff1a;即把一段中文或者别的划分成一个个的关键字&#xff0c;我们在搜索时候会把自己的信息进行分词&#xff0c;会把数据库中或者索引库中的数据进行分词&#xff0c;然后进行一一个匹配操作&…

Java密码校验(正则表达式):密码由这四种元素组成(数字、大写字母、小写字母、特殊字符),且必须包含全部四种元素;密码长度大于等于8个字符。

1. 需求 对用户密码的强度进行校验&#xff0c;要求用户密码达到一定的强度&#xff0c;符合安全性要求。 1.1. 基础版需求 密码必须由字母和数字组成&#xff08;同时包括数字和数字&#xff09;&#xff1b;密码长度大于等于8个字符。 1.2. 进阶版需求 密码由这四种元素…

【ARM Coresight 系列文章 8.1 - ARM Coresight 通过 APBIC arbiter】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 APBIC arbiter仲裁使用举例APBIC arbiter 在 SoC-600中,APBIC 是用来为 APB4 master 和 APB4 slave 提供 连接关系的组件。APB 是一种简单的总线协议,通常用于低带宽或低性能外设,如定时器、接口控制等。APBIC …