- 双指针,自己独立写出来了,但是看起来不够简洁
class Solution {
public:
void reverseString(vector<char>& s) {
int len=s.size();
int left=0,right=len-1;
while(left<right){
swap(s[left],s[right]);
left++;
right--;
}
}
};
卡哥代码:很简洁
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循环里做文章
- for循环里以2k为单位处理
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;
}
};
- 数组填充类问题,可以扩充大小,然后从后向前操作
class Solution {
public:
string replaceSpace(string s) {
int cnt=0;
int oldsz=s.size();
for(int i=0;i<oldsz;i++){
if(s[i]==' ') cnt++;//空格怎么表示
}
s.resize(oldsz+cnt*2);
int newsz=s.size();
int left=oldsz-1,right=newsz-1;
while(left>=0){
if(s[left]!=' ') {
s[right]=s[left];
left--;
right--;
}
else {
s[right]='0';
s[--right]='2';
s[--right]='%';//注意--right 是先减再使用 right-- 是先使用再减
left--;
right--;
}
}
return s;
}
};
151. 反转字符串中的单词
看了思想,还没敲
剑指 Offer 58 - II. 左旋转字符串
原地处理字符串方法:局部翻转,整体翻转
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(),n+s.begin());
reverse(n+s.begin(),s.end());
reverse(s.begin(),s.end());
return s;
}
};
自己写的,用了substr,额外申请了空间
class Solution {
public:
string reverseLeftWords(string s, int n) {
string ans;
string qian=s.substr(0,n);
ans=s.substr(n,s.size()-n)+qian;
return ans;
}
};