【算法练习Day7】反转字符串替换空格反转字符串中的单词左旋转字符串

news2025/1/22 14:44:40

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 反转字符串
  • 反转字符串 II
  • 替换空格
  • 反转字符串中的单词
  • 左旋转字符串
  • 总结:

反转字符串

344. 反转字符串 - 力扣(LeetCode)
在这里插入图片描述

这道题思路并不难,甚至可以直接reverse调用库函数来一步到位(但是我之前并不知道这个库函数)reverse(开始地址,结束地址),可以将一个字符串从前到后依次反转,也就是第一个元素跑到最后一位,第二位元素跑到倒数第二个位置上,以此类推,不过直接使用reverse就失去了做题的意义了。

于是有了另一种思路:用双指针的思路,一层遍历,将字符串反转,与其说是换一种思路,倒不如说是reverse库函数的一种实现,代码如下

class Solution {
public:
    void reverseString(vector<char>& s) 
    {
        int l=s.size();
        for(int i=0,j=l-1;i<l/2;i++,j--)
        swap(s[i],s[j]);
    }
};

反转字符串 II

541. 反转字符串 II - 力扣(LeetCode)
在这里插入图片描述

反转字符串II这题,乍一看好像真的比上一道要难不少,要求很多,不知道该如何下手,但是只要知道思路了,代码很容易实现,题目大意是给一个字符串和一个整数k,每隔2k个数字,就反转前k个字符,如果剩余字符不足2k但是大于或等于k个反转前k个剩余保持不变(等待再次判断),如果小于k个全部反转。这道题的精髓在于控制一个变量,使它一次走2k步,在循环中用if来调整其余的判断部分,这样可以使代码变得富有规律,且代码不易冗余。

class Solution {
public:
    string reverseStr(string s, int k) {
        for(int i=0;i<s.length();i+=2*k){
            if(i+k<=s.length())//<=十分重要
            reverse(s.begin()+i,s.begin()+i+k);
            else
            reverse(s.begin()+i,s.end());
        }
        return s;
    }
};

在代码中我们可以看到,进入循环我们直接判断剩余的元素个数满足哪一个条件,请注意,字符反转与否,与剩余字符有着很大的关联!不要将题目理解错误,我们在if里面包含了上述题目中,剩余字符很多(可以继续遍历2k个)和剩余字符大于k但不足2k个两种情况,也就是说以上两种情况,都是可以正常反转k个,如果到了else那就说明不足k个了,只能将后面元素全部反转了。理清思路了,代码还是很好写的。

替换空格

替换空格 - 牛客

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1: 输入:s = “We are happy.”
输出:"We%20are%20happy.

这道也是之前在牛客上做过的一道题,只是忘记了思路。后来看了题解想了起来,题目思路不算难,但是没有做过基本很难做出来,题目要求是给你一个字符串,将字符串中空格位置区域替换成%20的符号,思路是遍历一遍字符串查找有多少个空格,在字符串后面补充空格数*2,因为本来有一个空格,所以只需乘以2就足够了,然后用双指针方法,一个指针指向新空间末尾,一个指针指向字符串末尾,遇到字符就复制过来,遇到空格填充%20,整体代码没有难度,只是思路有点难想。

class Solution {
public:
    string replaceSpace(string s) {
        int len1=s.size();int count=0;// 统计空格的个数
        for(int i=0;i<len1;i++)
        {
            if(s[i]==' ')
            count++;
        }
        // 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
        s.resize(s.size()+2*count);
        int len2=s.size();
         // 从后先前将空格替换为"%20"
        for(int i=len2,j=len1;i>j;i--,j--)
        {
            if(s[j]==' ')
            {
                s[i]='0';
                s[i-1]='2';
                s[i-2]='%';
                i-=2;
            }
            else
            s[i]=s[j];
        }
        return s;
    }
};

时间复杂度: O(n)
空间复杂度: O(1)

反转字符串中的单词

151. 反转字符串中的单词 - 力扣(LeetCode)
在这里插入图片描述

这道题目leetcode给出中等,这道题实际上包含了字符串的很多操作,十分繁琐,说是困难题应该也不为过,题目要求将给定字符串去除除了每个单词之间的空格之外的所有空格,并且将整个字符串反转,这个字符串的前后和中间都有可能出现多个空格,这是难处理的点,然后还要将字符串内容全部反转(不是将每个字符反转,而是将单词反转)。

class Solution {
public:

    void reverse(string& s,int start,int end)
    {//翻转,区间写法:左闭右闭 []
        for(int i=start,j=end;i<j;i++,j--)
        {
            swap(s[i],s[j]);
        }
    }
    void removeExtraSpace(string& s)//去除所有空格并在相邻单词之间添加空格, 快慢指针。
    {
        int slow=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=' ')//遇到非空格就处理,即删除所有空格。
            {
                if(slow!=0)
                {//手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
                    s[slow++]=' ';
                }
                while(i<s.size()&&s[i]!=' ')
                { //补上该单词,遇到空格说明单词结束。
                    s[slow++]=s[i++];
                }
            }
        }
        s.resize(slow);//slow的大小即为去除多余空格后的大小。
    }
    string reverseWords(string s) {
        removeExtraSpace(s);//去除多余空格,保证单词之间之只有一个空格,且字符串首尾没空格。
        reverse(s,0,s.size()-1);
        int start=0;//removeExtraSpaces后保证第一个单词的开始下标一定是0。
        for(int i=0;i<=s.size();i++)
        {
            if(i==s.size()||s[i]==' ')
            {//到达空格或者串尾,说明一个单词结束。进行翻转。
                reverse(s,start,i-1);//翻转,注意是左闭右闭 []的翻转。
                start=i+1;//更新下一个单词的开始下标start
            }
        }
        return s;
    }
};

最上面的部分,是自定义的交换字符的函数,实现的是前闭后闭的思路,后面的代码主要是删除多余空格,第一个while让fast指针向后走,主要是为了删除开头多余的空格,for循环判断fast指针如果不在第一个位置,说明单词要直接插进去,如果大于0,且前面有空格当前所在位置也有空格,那么说明空格多出来了,需要删掉,这里我们的处理方法与这篇博客中的 移除元素 方法一致。

之后最关键的一步也就是反转字符串,第一次先将字符串整体反转,这样就将整个字符串的所有字符全部反转了,也就是说最后一个字符和第一个字符交换,以此类推。这样最后一个单词的反转就到了第一个位置,倒数第二单词的反转就到了第二个位置,这样的反转已经完成了题目要求的一半了,之后我们的思路就是将每个单词再反转,如何判断呢?

当我们遍历到空格那就说明遍历到一个单词的最后一个字符了,那么我们将这个单词整体反转,如果遍历到最后一个单词,当变量i走到字符最后一个位置说明该反转最后一个单词了,这里的start尤为重要,它标识了一个单词反转的起始位置,而i标识了这个单词的结束位置,遵循先整体反转再局部反转的原则。

时间复杂度: O(n)
空间复杂度: O(1)

左旋转字符串

左旋转字符串 - 牛客
在这里插入图片描述

左旋字符串,就是将该字符串的左边k个字符旋转到字符串后面但是并不将任何部分反转,只不过是将字符调整了位置。

不限制空间复杂度的情况下,最简单的方法就是新开字符串,将后面的部分先复制到新字符串里,紧接着又将前面的部分取下复制到新字符串里就完成了。

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int len=str.size();
        if(len==0)
        {
            return "";
        }
        n%=len;
        string result;
        for(int i=n;i<str.size();i++)
        result.push_back(str[i]);
        for(int i=0;i<n;i++)
        result.push_back(str[i]);
        return result;
    }
};

如果要求空间复杂度呢?不允许开辟新内存,只能在原字符串操作呢?

我们先将前半部分反转,再将后半部分反转,最后再反转整体,是不是很神奇?可以自行模拟下

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int len=str.size();
        if(len==0)
        {
            return "";
        }
        n%=len;
        reverse(str.begin(),str.begin()+n);
        reverse(str.begin()+n,str.end());
        reverse(str.begin(),str.end());
        return str;
    }
};

总结:

今天我们完成了字符串章节的几道题,与之前的一些题有相似之处,相关的思想需要多复习回顾。接下来,我们继续进行算法练习·。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

【洛谷 P1644】跳马问题 题解(深度优先搜索)

跳马问题 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图 1 1 1 所示。马自左下角 ( 0 , 0 ) (0,0) (0,0) 向右上角 ( m , n ) (m,n) (m,n) 跳。规定只能往右跳&#xff0c;不准往左跳。比如图 1 1 1 中所…

修改switch Nand无线区码 以支持高频5G 信道

环境&#xff1a;NS switch 问题&#xff1a;日版&#xff0c;港版无法连接大于44信道的5G WIFI 解决办法&#xff1a;修改PRODINFO.dec的WIFI 区域码 背景&#xff1a;我的switch是最早买的港版的一批&#xff0c;WIFI 只能连接日本的信道&#xff0c;家里的路由器是大陆的&am…

CentOS7安装Oracle XE记录

本文仅是CentOS7安装Oracle XE记录&#xff0c;供参考 1、下载安装包 oracle-xe-11.2.0-1.0.x86_64.rpm.zip 2、安装 &#xff08;1&#xff09;第一次安装 [rootnode1 opt]# cd oracle-xe/ [rootnode1 oracle-xe]# ll 总用量 309884 -rw-r--r-- 1 root root 317320273 6月…

软件设计模式系列之十七——解释器模式

1 模式的定义 解释器模式是一种行为型设计模式&#xff0c;它用于将一种语言或表达式解释为对象。该模式通过定义语言的文法规则&#xff0c;并使用解释器来解释和执行这些规则&#xff0c;将复杂的语言转换为对象的操作。 在软件开发中&#xff0c;解释器模式常用于处理类似…

初识ebpf

介绍eBPF技术 当代计算机系统中&#xff0c;性能、安全性和可观察性是至关重要的关键因素。为了应对这些挑战&#xff0c;Linux 内核引入了一种名为eBPF&#xff08;extended Berkeley Packet Filter&#xff09;的强大技术。eBPF 不仅仅是一种网络数据包过滤器&#xff0c;它…

轻松拿下Offer!20个Salesforce管理员顾问的基础面试问题

先是Salesforce第二财季业绩远超预期&#xff0c;股价大涨&#xff0c;后是首席执行官Marc Benioff表示将在各部门招聘3300名员工&#xff0c;生态系统呈现欣欣向荣的态势&#xff0c;Salesforce也成为越来越多人的职业选择。 管理员作为入门级的岗位&#xff0c;是小白和新手…

黑豹程序员-再不怕猪队友把配置文件上传git暴露数据库密码了

问题&#xff1a; 项目中含有配置文件&#xff0c;而配置文件中含有数据库的用户名和密码。而团队猪队友不论三七二十一玩git时全都上传git。git上开放给外部用户。外部用户获得数据库ip地址&#xff0c;用户名&#xff0c;密码。如果运维猪队友数据库为方便直接对外网开放。那…

CSS笔记——Display属性元素分类(行内、块,行内块)CSS默认样式及解决方案

1、display属性 ​ 可取值&#xff1a; ​ none 影藏&#xff08; 自身及其后代&#xff0c;一般用block值恢复&#xff09; ​ block 块元素 ​ inline 行内元素 ​ inline-block 行内块元素 ​ list-item (l列表元素的display值&#xff0c;实际效果比块元素多了列表的项目符…

洗地机性价比高的是哪款?高性价比洗地机排名

洗地机已成为当下备受欢迎的智能家电之一&#xff0c;但在挑选合适的洗地机时&#xff0c;面对各种新词汇和功能选择&#xff0c;可能会让人感到困惑。因此&#xff0c;为了帮助大家在购买洗地机时不踩坑&#xff0c;我们基于市面上主流品牌的综合分析对比&#xff0c;总结出来…

C++项目笔记--基于TensorRT搭建一个YoloV5服务器

目录 1--项目描述 2--项目地址 3--编译运行 4--测试结果 5--补充说明 1--项目描述 ① 基于 C/S 模型来构建 TCP 服务器和 TCP 客户端。 ② 使用 Epoll 来监控服务器和客户端之间的连接。 ③ 服务器和客户端约定使用相同的数据传输协议&#xff0c;头部分别使用 4 个字节来…

Windows下配置MySQL源码调试环境

Windows下配置MySQL源码调试环境 环境准备编译安装MySQL DeBug版MySQL初始化安装VS Code插件调试 参考链接&#xff1a; https://zhuanlan.zhihu.com/p/651665372 https://zhuanlan.zhihu.com/p/606732848 环境准备 # 创建存放源码的根目录 mkdir -p /root/code# 进入存放源码…

凹凸贴图和法线贴图的渲染效果对比

1、什么是凹凸贴图 凹凸贴图&#xff08;bump mapping&#xff09;是一种计算机图形学中的渲染技术&#xff0c;用于在给定的表面上模拟微小的凹凸纹理。通过在表面法线方向上微调每个像素的光照值&#xff0c;可以给平滑的表面增加视觉上的凹凸感。 在凹凸贴图中&#xff0c;每…

“押宝高手”乐视视频再出手,看中商业传奇剧《大盛魁》

作为最早开始版权采购的长视频平台&#xff0c;乐视视频一向擅长“押宝”优质内容。从《甄嬛传》到《白鹿原》等&#xff0c;乐视拿下了众多经典古装剧、年代剧的版权。 9月&#xff0c;乐视视频再次出手拿下的历史传奇剧《大盛魁》开始热播。该剧由王新民导演执导&#xff0c…

如何开始着手一篇Meta分析 | Meta分析的流程及方法

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

CMake、QMake和编译器的关系

目前这是小编理解的关系&#xff0c;在window中使用到GCC编译器的变体之后&#xff0c;为了方便编译&#xff0c;qt就使用了qmake&#xff0c;而CMake相比qmake更加强大&#xff0c;目前小编在VS中用于生成vs项目工程。 小编理解应该不是很透彻&#xff0c;如果有人看出问题&am…

layui+java spring 实现图片文件新增到数据库

项目场景&#xff1a; layuijava spring 实现图片文件新增到数据库 解决方案&#xff1a; 1.首先layui是个不再更新的网址有想了解的可以浏览官网 表格组件 table - Layui 文档 2.官网内有专门的组件 代码直接粘过来即可 <!DOCTYPE html> <html> <head> …

【IDEA】idea恢复pom.xml文件显示灰色并带有删除线

通过idea打开spring boot项目后&#xff0c;发现每个服务中的pom.xml文件显示灰色并带有删除线&#xff0c;下面为解决方案 问题截图 解决方案 打开file——settings——build,execution,deployment——Ignored Files&#xff0c;把pom.xml前面的复选框去掉&#xff0c;去掉之…

Java反编译工具JD-GUI使用记录

1.下载JD-GUI https://www.onlinedown.net/soft/70298.htm​​​​​​https://www.onlinedown.net/soft/70298.htm 2.启动JD-GUI 进入JD-GUI目录下&#xff0c;dos窗口执行java -jar .\jd-gui.exe&#xff0c;就会弹出工具框&#xff0c;左上角打开项目jar包&#xff0c;即可…

关于汽车维修类中译英的英语翻译

随着全球汽车行业的不断发展&#xff0c;国际化程度的深化使得汽车产业的多语言交流需求日益旺盛&#xff0c;所以汽车翻译及本地化服务的重要性愈发凸显。那么&#xff0c;如何才能做好汽车翻译呢&#xff1f;汽车维修类英语翻译又有哪些要求呢&#xff1f; 我们知道 &#xf…

【机器学习 | 非线性拟合】梯度下降 vs SLSQP算法,谁更胜一筹? 解决六个数据点的非线性拟合难题,挑战非线性拟合问题

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…