Leetcode 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]);
}
}
};
Leetcode 541. 反转字符串 II
思路:因为每次计数到2k
个字符,所以每次循环下标+2k
而不是+1
,并反转前k
个数,注意还要判断剩余字符个数是否大于等于k
个
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=2*k){
if(i+k<=s.size()){ //反转2k中的前k个字符
reverse(s.begin()+i,s.begin()+i+k);
}
else
reverse(s.begin()+i,s.end()); //反转剩余字符
}
return s;
}
};
卡码网 54. 替换数字
思路:使用双指针法,先将字符串扩充到每个数字字符替换成 “number” 之后的大小。一个指针指向扩充后的字符串末尾,一个指针指向扩充前字符串的末尾,然后指针向前移动填充字符串
#include <iostream>
using namespace std;
int main(){
string s;cin>>s;
int size = s.size(); //旧数组大小
int cnt = 0;
for(int i=0;i<s.size();i++){
if(s[i]>='0' && s[i]<='9')
cnt++;
}
s.resize(size+cnt*5);
int size1 = s.size(); //新数组大小
for(int i=size-1,j=size1-1;i<j;i--,j--){
if (s[i]>='0' && s[i]<='9'){
s[j]='r';
s[j-1]='e';
s[j-2]='b';
s[j-3]='m';
s[j-4]='u';
s[j-5]='n';
j-=5;
}
else
s[j]=s[i];
}
cout<<s<<endl;
return 0;
}
Leetcode 151. 反转字符串中的单词
思路:前去除字符串中多余的空格,然后将整个字符串反转,再单独将每一个单词反转
class Solution {
public:
void removeSpace(string &s){
int slow = 0;
for(int i=0;i<s.size();i++){
if(s[i]!= ' '){
if(slow != 0) //slow不是首单词
s[slow++]=' '; //在单词前添加一个空格
while(i<s.size() && s[i]!= ' ')
s[slow++]=s[i++]; //补上单词
}
}
s.resize(slow); //slow的大小为去除空格后字符串长度
}
string reverseWords(string s) {
removeSpace(s); //去除字符串中多余的空格
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. 右旋字符串
思路:先将整个字符串分为两个部分,长度为k
和s.size()-k
,然后将整个字符串反转,再分别将字符串两个部分反转
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int k;cin>>k;
string s;cin>>s;
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+k);
reverse(s.begin()+k,s.end());
cout<<s<<endl;
return 0;
}