day08 反转字符串 反转字符串Ⅱ 替换数字 翻转字符串里的单词 右旋转字符串

题目1:344 反转字符串

题目链接:344 反转字符串

题意

字符串是数组的形式,使用O(1)的空间将字符串反转

双指针法

法一

代码

class Solution {
public:void reverseString(vector<char>& s) {for(int i=0,j=s.size()-1;i<s.size()/2;i++,j--){swap(s[i],s[j]);}}
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)
法二

代码

class Solution {
public:void reverseString(vector<char>& s) {int left = 0;int right = s.size()-1;while(left<=s.size() && right>=0 && right>left){swap(s[left],s[right]);left++;right--;}}
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

延伸(swap的实现)

法一(使用中间变量temp)
int temp = s[i];
s[i] = s[j];
s[j] = temp;
法二(使用位运算)异或交换法
//开始s[i]==a  s[j]==b
s[i]^=s[j];  //s[i]=a^b   a异或b
s[j]^=s[i];  //s[j]=b^(a^b)=a
s[i]^=s[j];  //s[i]=a^(a^b)=b
//最终s[i]==b  s[j]==a

题目2:反转字符串Ⅱ

题目链接:541 反转字符串Ⅱ

题意

字符串s每计数至2k个字符,就反转这2k个字符的前k个字符;

剩余字符少于k个,就将剩余字符全部反转;如果剩余字符大于等于k个且小于2k个,反转前k个字符

巧妙解法

i+=(2*k),i每次移动2k个距离

代码

class Solution {
public:string reverseStr(string s, int k) {for(int i=0;i<s.size();i+=2*k){if(i+k<=s.size()){reverse(s.begin()+i,s.begin()+i+k);continue;//继续寻找下一组}reverse(s.begin()+i,s.end());}return s;}
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

代码

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

题目3:54 替换数字

题目链接:54 替换数字

题意

字符串s(包含小写字母和数字字符)将数字字符替换位number,字母不变

不能简单地遇到数字就将其替换位number,因为数字是1个字符,而number是6个字符,直接替换的话,大小不对等,需要扩充大小

双指针

i指向新串的末尾,j指向旧串的末尾,从后向前遍历

详细的遍历过程

逻辑问题
例1:for循环中j<i   为啥j不能小于等于i呢?

原因

例2 为啥i,j要从后往前遍历,从前向后遍历不行嘛?

从前向后遍历的话,遇到数字字符,就需要将该数字字符后面的字符向后移动5个格,然后才可以填充number,时间复杂度是O(n^2)

代码

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){string s;cin>>s;int count = 0;int oldsize = s.size();for(int i=0;i<s.size();i++){if(s[i]>='0'&& s[i]<='9'){count++;}}s.resize(s.size()+count * 5);int newsize = s.size();for(int i=newsize-1,j=oldsize-1;j<i;i--,j--){if(s[j]>='a'&&s[j]<='z'){s[i]=s[j];}else{s[i] = 'r';s[i-1] = 'e';s[i-2] = 'b';s[i-3] = 'm';s[i-4] = 'u';s[i-5] = 'n';i -= 5;}}cout<<s<<endl;
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

题目4:151 反转字符串里的单词

题目链接:151 反转字符串中的单词

题意

反转字符串s中单词的顺序   输入的字符串的开头或结尾可能会存在多个空格,单词与单词之间可能也存在多个空格

反转字符串时,仅仅在单词与单词之间有1个空格 

关键是字符串去除空格的逻辑,反转的逻辑:整体反转+局部反转

双指针(删除多余空格)

fast指向单词,slow指向单词所在的新的位置  

添加空格

在每个单词移动之前,添加一个空格,第一个单词除外

实例

代码

class Solution {
public:string reverseWords(string s) {//1 移除多余空格int slow = 0;for(int fast=0;fast<s.size();fast++){if(s[fast]!=' '){//找到了单词//单词前添加一个空格if(slow!=0){s[slow] = ' ';slow++;}//将单词移动到新的位置while(fast<s.size() && s[fast]!=' '){s[slow] = s[fast];slow++;fast++;}  }}s.resize(slow);//2 反转单词//①整体反转reverse(s.begin(),s.end());//左闭右开//②单词反转int start = 0;for(int i=0;i<=s.size();i++){//reverse左闭右开if(s[i]==' ' || i==s.size()){//每个单词后有空格,最后一个单词后没空格reverse(s.begin()+start,s.begin()+i);//reverse左闭右开start = i + 1;}}return s;}
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1) 
一般思路(分3种情况讨论)

字符串前有空格  字符串中有多余空格    字符串后有多余空格

代码

class Solution {
public:void removespace(string& s){int slow = 0;int fast = 0;//去掉前面的空格,寻找有效的字符,持续过程,开头可能有多个空格while(fast<s.size()&&s[fast]==' '){fast++;}//去掉中间多余的空格,如果原字符串末尾有空格的话,会使得末尾有1个空格for(;fast<s.size();fast++){//使用fast+1的话,fast+1可能会越界if(fast-1>0 && s[fast]==s[fast-1] && s[fast]==' '){continue;}else{//不是空格时,直接将fast位置处的值赋值给slow,然后slow向后移动一个位置s[slow] = s[fast];slow++;}}//去掉末尾的1个空格,因为上述代码的slow++了,slow会移动到多一个位置的地方,所以判断slow-1if(slow-1>0&&s[slow-1]==' '){s.resize(slow-1);}else{//原字符串末尾没有空格s.resize(slow);}}string reverseWords(string s) {removespace(s);//去除字符串中多余的空格reverse(s.begin(),s.end());//左闭右开,将字符串全部反转int start = 0;//反转单词的首字母的位置for(int i=0;i<=s.size();i++){if(s[i]==' ' || i==s.size()){//这里有两种情况,单词以空格结尾,单词是最后一个单词reverse(s.begin()+start,s.begin()+i);start = i + 1;//下一个单词的首字母的位置}}return s;}
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1) 

题目5:55  右旋转字符串

题目链接:55 右旋转字符串

题意

将字符串s后面的k个字符移到字符串的前面,实现右旋转操作

整体反转+局部反转

代码

#include<iostream>
#include<algorithm>
using namespace std;
int main(){string s;int k;cin>>k;cin>>s;//整体反转reverse(s.begin(),s.end());//局部反转reverse(s.begin(),s.begin()+k);reverse(s.begin()+k,s.end());cout<<s<<endl;
}

局部反转+整体反转

代码

#include<iostream>
#include<algorithm>
using namespace std;
int main(){string s;int k;cin>>k;cin>>s;//整体反转reverse(s.begin(),s.begin()+s.size()-k);//局部反转reverse(s.begin()+s.size()-k,s.end());reverse(s.begin(),s.end());cout<<s<<endl;
}

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

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

相关文章

YoloV8改进策略:Shape-IoU,考虑边框形状与尺度的度量

摘要 本文尝试使用最新的Shape-IoU改进YoloV8,在我自己的数据集上实现了涨点。 论文:《Shape-IoU:考虑边框形状与尺度的度量》 https://arxiv.org/pdf/2312.17663.pdf 作为检测器定位分支的重要组成部分,边界框回归损失在目标检测任务中发挥着重要作用。现有的边界框回归…

2024年中国股市会发生怎样的格局变化?

&#xff08;1&#xff09; 本来桌面上坐了四个利益方&#xff1a; 主力 北上 游资 散户 &#xff08;1&#xff09; 主力有两种&#xff0c;一种是国家队&#xff0c;是压舱石&#xff0c;不能乱动&#xff0c;是稳定政府方投资的各种中特估金特估、科创专精特新。不能让政府的…

linux中最常用的网络命令

文章目录 linux中最常用的网络命令查看网络信息的原初 ifconfig默认无参数使用-s显示短列表配置IP地址修改MTU启动关闭网卡 网络中不中&#xff0c;先看ping行不行语法不加任何参数发送指定数目设定发送时间间隔组合使用 Linux ip命令显示网络设备设置IP地址启动关闭网卡统计方…

MIML-DA

图3呢&#xff1f;且作者未提供代码

C#编程-显示运算符重载

重载函数的概念也可以应用于运算符。在将C#运算符应用到用户定义的数据类型时,运算符重载为它们提供额外的能力。只可以重载预定义的C#运算符组。 运算符重载的必要性 大多数内置数据类型都有与它们相关的预定义运算符。例如:带有运算符+、-、*和/的C#数据类型int为数学运算…

【大数据】基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL 1.准备阶段1.1 准备教程所需要的组件1.2 下载 Flink 和所需要的依赖包1.3 准备数据1.3.1 在 MySQL 数据库中准备数据1.3.2 在 Postgres 数据库中准备数据 2.启动 Flink 集群和 Flink SQL CLI3.在 Flink SQL CLI 中使用…

STL标准库与泛型编程(侯捷)笔记1

STL标准库与泛型编程&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

Java流程控制的陷阱

文章目录 1. switch中break的作用2. switch支持的数据类型3. else隐含的条件4. 省略花括号的陷阱5. for循环的结构6. 使用标签跳出双层for循环 流程控制三种&#xff1a;顺序结构、分支结构、循环结构 分支机构两种&#xff1a;if语句、switch语句 循环结构&#xff1a;while循…

JumpServer一键安装脚本

JumpServer 一键安装命令如下&#xff1a; curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash上述quick_start.sh脚本详细内容如下&#xff1a; #!/usr/bin/env bash #VERSIONv3.10.1 DOWNLOAD_URLhttps://re…

【APACHE】的认识和基础配置参数

#主页传送:江南的江 #每日鸡汤&#xff1a;人生没有如果和假设&#xff0c;只有后果和结果。生活有进有退&#xff0c;输什么也不能输心情。生活简单就是迷人的&#xff0c;学会简单其实就是不简单。要学会平静地接受现实&#xff0c;学会对自己说声顺其自然&#xff0c;学会坦…

MS4553S用于开漏模式和推拉模式的 2bit 双向电平转换器,可替代TXS0102/PCA9306等

产品简述 MS4553S 是一款双向电平转换器&#xff0c;可以用作混合电压的数字信 号系统中。其使用两个独立构架的电源供电&#xff0c; A 端供电电压范围是 1.65V 到 5.5V &#xff0c; B 端供电电压范围是 2.3V 到 5.5V 。可用在电压为 1.8V 、 2.5V 、 3.3V 和 5V 的信号转…

C++系列十四:结构体

C中的结构体 一、结构体的定义 在C中&#xff0c;结构体是一种自定义的数据类型&#xff0c;它允许我们将不同类型的数据组合在一起。结构体可以包含任意类型的数据&#xff0c;包括基本数据类型、指针、数组、其他结构体等。 定义结构体的语法如下&#xff1a; struct 结构…

目前最完整的WebRTC资源平台 —— 筑梦之路

webrtcwork.com 是一个非常好的网站&#xff0c;笔者从那里获得了很多有价值的学习资源&#xff0c;比如服务器端压力测试&#xff0c;商业WebRTC部署等资料。 地址&#xff1a;webrtcwork - Resources for those working with WebRTC 做个笔记

如何用UE5 的小白人替换成自己的 metahumen 数字人

1、用QuixelBridge 插件导入制作好的metahumen数字人 2、创建项目时如有选择第三人称游戏&#xff0c;在内容目录中找到第三人称游戏小白人的蓝图类&#xff0c;对其进行复制一个&#xff0c;重命名&#xff0c;我这里命名为BP_METAHUMEN&#xff0c; 并移到Metahumen目录下方便…

安全基础~信息搜集3

文章目录 知识补充APP信息搜集php开发学习理解漏洞 知识补充 端口渗透总结 python Crypto报错&#xff1a;https://blog.csdn.net/five3/article/details/86160683 APP信息搜集 1. AppInfoScanner 移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具 使用教程 演示&…

第三十八周周报:文献阅读 +BILSTM+GRU+Seq2seq

目录 摘要 Abstract 文献阅读&#xff1a;耦合时间和非时间序列模型模拟城市洪涝区洪水深度 现有问题 提出方法 创新点 XGBoost和LSTM耦合模型 XGBoost算法 ​编辑 LSTM&#xff08;长短期记忆网络&#xff09; 耦合模型 研究实验 数据集 评估指标 研究目的 洪…

适合前后端开发的可视化编辑器(拖拽控件)

分享一个面向研发人群使用的前后端分离的低代码软件——JNPF。 JNPF与市面上其他的低代码&#xff08;轻流、宜搭、微搭、简道云、轻流、活字格等等&#xff09;&#xff0c;后者更倾向于非编程人员使用&#xff0c;让业务线人员自行构建应用程序。而 JNPF 这款低代码产品是面向…

Linux学习记录——삼십유 传输层TCP协议(1)

文章目录 1、TCP协议报文1、报头和有效载荷的分离2、TCP可靠性3、序号和确认序号4、16位窗口大小5、6个标志位和紧急指针 2、TCP可靠性1、应答机制2、超时重传机制3、连接管理机制握手挥手 3、流量控制 1、TCP协议报文 UDP属于TCP/IP协议族。 1、报头和有效载荷的分离 从头…

1、Excel工作场景和知识点总结

参考&#xff1a; 戴师兄–戴你玩转数据分析 Excel发挥战斗力的场景 地量级数据的存储 我们日常所用的各种数据表格&#xff0c;基本都以excel的.xlsx或者.xls格式进行存储。并且因为大家电脑上都有excel&#xff0c;这就使excel的通用性很高(我用excel做好一个表发给你&#x…

uniapp选择android非图片文件的方案踩坑记录

这个简单的问题我遇到下面6大坑&#xff0c;原始需求是选择app如android的excel然后读取到页面并上传表格数据json 先看看效果 uniapp 选择app excel文件读取 1.uniapp自带不支持 uniapp选择图片和视频非常方便自带已经支持可以直接上传和读取 但是选择word excel的时候就出现…