节约时间,只有代码和一些小总结。
344.反转字符串
直接反转即可。
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i=0,j=s.size()-1;i<j;i++,j--)
swap(s[i],s[j]);
}
};
541. 反转字符串II
注意反转起点和终点
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);
}
if(i+k>s.size())
{
reverse(s.begin()+i,s.end());
}
}
return s;
}
};
卡码网:54.替换数字
未运行,思路以及清晰,主要是在原数组操作,获取重建的大小,然后使用双指针从新建大小尾部,和原大小尾部向前操作。
151.翻转字符串里的单词
反转字符串里的单词,同时去掉多余的空格,第一个先把多余的空格去掉也就是去掉一个特定字符的双指针解法在每个单词后补一个空格,注意判断slow是否为0,就是是否为第一个单词,不用加空格。然后翻转字符串的所有单词可以通过先反转整个字符串,再根据空格翻转每个单词即可。
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,fast=0;
for(;fast<s.size();++fast)
{
if(s[fast]!=' ')
{
if(slow!=0)
s[slow++]=' ';
while(s[fast]!=' '&&fast<s.size())
{
s[slow++]=s[fast++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
removeextraspace(s);
reverse(s,0,s.size()-1);
for(int i=0, j=0;i<=s.size();++i)
{
if(s[i]==' '||i==s.size())
{
reverse(s,j,i-1);
j=i+1;
}
}
return s;
}
};
卡码网:55.右旋转字符串
分段反转即可。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
string s;
cin>>n;
cin>>s;
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
cout<<s<<endl;
}