题目部分
344.反转字符串
就是个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
加了个判断
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.end());
else reverse(s.begin()+i,s.begin()+i+k);
}
return s;
}
};
卡码网54.替换数字
先扩充字符串长度再用双指针填充
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
while(cin>>s){
int count=0;
int oldsize=s.size();
for(int i = 0;i<oldsize;i++){
if(s[i]>='0'&&s[i]<='9')count++;
}
s.resize(oldsize+count*5);
int left = oldsize-1;
int right = s.size()-1;
while(right>left){
if(s[left]<'0'||s[left]>'9'){
s[right]=s[left];
right--;
left--;
}else{
s[right] = 'r';
s[right-1] = 'e';
s[right-2] = 'b';
s[right-3] = 'm';
s[right-4] = 'u';
s[right-5] = 'n';
right-=6;
left--;
}
}
cout<<s;
}
}
151.翻转字符串里的单词
空格处理有点麻烦,看的答案
class Solution {
public:
string reverseWords(string s) {
int slow=0,fast=0;
for(;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);
reverse(s.begin(),s.end());
int start=0;
for(int i =0;i<=s.size();++i){
if(i==s.size()||s[i]==' '){
reverse(s.begin()+start,s.begin()+i);
start = i+1;
}
}
return s;
}
};
卡码网55.右旋转字符串
就是3个reverse
reverse(s.begin(), s.end()); // 整体反转
reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n
reverse(s.begin() + n, s.end()); // 再反转后一段