344.反转字符串
建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数---库函数是解题的一部分的时候才可以用
题目链接:力扣
思路:本题用到了一个swap函数。
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]);
}
}
};
541. 反转字符串II
建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。
题目链接:力扣
思路:每次处理是以2k处理,每次翻转k,如果不够2k,全部翻转。2k为循环进行遍历。这里使用的函数是reverse函数。注意reverse(i,i+k)函数进行翻转的时候,是左闭右开的情况。
下面的代码有一个地方是需要进行注意的,就是进行转换的过程之中,存在一个s.begin()+某一个数,我在编写代码的时候,忘记了s.begin()导致代码总是编译不过去。
class Solution {
public:
string reverseStr(string s, int k) {
//首先是以2k为循环,依次进行下去
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.begin()+s.size());
}
return s;
}
};
剑指Offer 05.替换空格
建议:对于线性数据结构,填充或者删除,后序处理会高效的多。好好体会一下。
题目链接:力扣
class Solution {
public:
string replaceSpace(string s) {
//首先记录空格的数量
int count_space = 0;
for(int i = 0;i < s.size();i++)
{
if(s[i]==' ')
{
count_space++;
}
}
int oldsize = s.size();
s.resize(s.size()+count_space*2);
int newsize = s.size();
//开始从后往前进行遍历
for(int i = newsize-1,j=oldsize-1;j<i;i--,j--)
{
if(s[j]!=' ')//注意这个条件
{
s[i]=s[j];
}
else{
s[i] = '0';
s[i-1] = '2';
s[i-2] = '%';
i-=2;
}
}
return s;
}
};
151.翻转字符串里的单词
建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。
思路:__wo_he__ -> wo_he -> ow_eh -> wo_he.
不要使用erase,因为erase时间复杂度为O(n),时间复杂度上去了。比如说:if( ){erase一下}因此这里使用双指针方式解决。
扫描二维码关注公众号,回复:
15472111 查看本文章
定义一个快指针,定义一个慢指针。
class Solution {
public:
void reverse(string &s,int begin,int end)
{
for(int i = begin,j = end;i<j;i++,j--)
{
swap(s[i],s[j]);
}
}
//这道题比较难,看视频没有看明白,按照自己的思路来
//首先是移除空格,所有的字母之间只是存在一个空格并且首尾字母之间不存在空格
void removeBlank(string &s)
{
int slow = 0;//慢指针
for(int i = 0;i<s.size();i++)
{
if(s[i]!=' ')//判断不为空的情况
{
if(slow!=0) s[slow++]=' ';//判断是否是第一个字母
while(i<s.size()&&s[i]!=' ')
{
s[slow++]=s[i++];
}
}
}
//删除空格
s.resize(slow);
}
string reverseWords(string s) {
removeBlank(s);//去除空格
reverse(s,0,s.size()-1);//翻转一下
int start = 0;
for(int i = 0;i<s.size();i++)
{
if((i != (s.size()-1)) && (s[i]==' '))//注意条件,到达尾端
{
reverse(s,start,i-1);
start = i+1;//这句代码写错了,导致我浪费了很多时间
}
else if(i == (s.size()-1))
{
reverse(s,start,i);
}
}
return s;
}
};
剑指Offer58-II.左旋转字符串
首先是进行反转前n个字符串,然后再反转后n个字符串,之后再进行整体翻转。
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
reverse(s.begin(),s.end());
return s;
}
};