344.反转字符串
思路
使用双指针
解题方法
使用双指针,交换两个指针。
复杂度
时间复杂度O(n)
空间复杂度O(1)
Code
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
思路
for循环时,让i每次走2k个单位
解题方法
for循环时,让i每次走2k个单位
复杂度
时间复杂度O(n)
空间复杂度O(1)
Code
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]);
}
}
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=2*k)
{
if(i+k<=s.size())
{
reverse(s,i,i+k-1);
continue;
}
reverse(s,i,s.size()-1);
}
return s;
}
};
卡码网:54.替换数字
复杂度
时间复杂度O(n)
空间复杂度O(1)
Code
#include<iostream>
using namespace std;
int main()
{
string s;
while(cin>>s)
{
int count=0;
int sold=s.size()-1;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
{
count++;
}
}
s.resize(s.size()+count*5);
int sld=s.size()-1;
while(sold>=0)
{
if(s[sold]>='0'&&s[sold]<='9')
{
s[sld--]='r';
s[sld--]='e';
s[sld--]='b';
s[sld--]='m';
s[sld--]='u';
s[sld--]='n';
}
else
{
s[sld--]=s[sold];
}
sold--;
}
cout<<s<<endl;
}
}
151.翻转字符串里的单词
思路
双指针
解题方法
先把字符串中多余的空格删除,然后再把字符串全反过来,最后再把单词单独反过来。
复杂度
时间复杂度O(n)
空间复杂度O(1)
Code
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)
{
s[slow++]=' ';
}
while(i<s.size()&&s[i]!=' ')
{
s[slow++]=s[i++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
RemoveExtraSpace(s);
reverse(s,0,s.size()-1);
int start=0;
for(int i=0;i<=s.size();++i)
{
if(i==s.size()||s[i]==' ')
{
reverse(s,start,i-1);
start=i+1;
}
}
return s;
}
};
卡码网:55.右旋转字符串
思路
先都反转一下,然后再局部反转
解题方法
先都反转一下,然后再局部反转。用reverse函数。
复杂度
时间复杂度O(n)
空间复杂度O(1)
Code
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
string s;
cin>>s;
int len=s.size();
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
cout<<s<<endl;
}