344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路:
双指针
看完代码随想录之后的思路:
确实双指针,然后swap交换。整个题目用函数来表示就是reverse。
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
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
思路:
暴力循环
看完代码随想录之后的思路:
每2k个区间内处理,而不是单个i进行for循环
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;
}
};
遇到的困难:
- 乘法必须加*号,不能省略不写:2*k
- ——————————————————————————————————————
- reverse(first, last):reverse中的两个参数表示翻转的范围,支持使用
++和--操作符进行移动、使用*操作符访问元素、以及使用<和>操作符比较元素。- first和last都是地址,输出时需要用*来取值。
- 且翻转后,直接将原数组后字符串进行修改,重新对其操作时,操作对象是上一次处理完的。
所有的内置函数区间,默认左闭右开,包括reverse
剑指Offer 05.替换空格
请实现一个函数,把字符串
s中的每个空格替换成"%20"。
思路:
检索空格然后插入20%
看完代码随想录之后的思路:
先数空格数,避免正向每次把后面数据推移,减小时间复杂度;倒置替换空格,空格减完不再遍历
class Solution {
public:
string replaceSpace(string s) {
int count=0;
int oldsize=s.size();
for(int i=0;i<s.size();i++)
{
if(s[i]==' ')count++;
}
s.resize(s.size()+count*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. 反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
思路:
逐个查找空格,然后翻转
看完代码随想录之后的思路:
双指针先把空格删减掉,然后reverse整体,最每个词进行翻转
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 removeExtraSpaces(string& s)
{
int slow=0;
for(int fast=0;fast<s.size();fast++)
{
if(s[fast]!=' ')
{
if(slow!=0)s[slow++]=' ';
while(fast<s.size()&&s[fast]!=' ')
{
s[slow++]=s[fast++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(s,0,s.size()-1);
int start=0;
for(int i=0;i<=s.size();i++)
{
if(s[i]==' '||i==s.size())
{
reverse(s,start,i-1);
start=i+1;
}
}
return s;
}
};
遇到的困难:
- else如果没有执行语句,不用写continue
- 删空格中,有一句判断是说,如果slow不在开始,fast每遇到一个不为空格的位置,slow先加一个空格,再和fast进行赋值操作。
- 最后每个单词进行reverse时,for的条件是<=s.szie(),这样就可以保证i可以移动到最后一个字母的后一位,保证中间所有单词和最后单词的翻转,都是start到 i-1
- 定义变量一定要给初值,否则会导致超时错误。(leecode不画红线的那种)
- start在单个单词翻转之后,更新是i+1,不是start++,更新的是一段长度,不是单个长度
剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
思路:
左边翻转、右边翻转,整体翻转
看完代码随想录之后的思路:
思路相同
遇到的困难:
reverse函数只有两个参数,开始索引和结束索引,区间是左闭右开。
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;
}
};
文章介绍了几种不同的字符串反转方法,如原地反转、反转指定区间、替换空格和反转单词等,主要利用双指针策略,并提供了相应的C++代码实现。同时,提到了在处理字符串时需要注意的细节,如额外空间限制和区间处理。
888

被折叠的 条评论
为什么被折叠?



