class Solution { //双指针解法(不使用额外空间,反转)-->双指针
public:
void reverseString(vector<char>& s) {
int left = 0, right = s.size() -1;
while(left < right){
swap(s[left], s[right]);
left++; right--;
}
}
};
class Solution {
public:
string reverseStr(string s, int k) {
int s_size = s.size();
int left, right;
for(int i = 0; i < s.size(); i += 2*k){
if(s_size - i >= k) {left = i; right = i + k - 1;} //注意区间,左闭右闭
else {left = i; right = s_size - 1;}
while(left < right){ //双指针
swap(s[left], s[right]);
left++; right--;
}
}
return s;
}
};
很多数组填充类的问题,做法都是先预先给数组扩容到填充后的大小,然后在从后向前进行操作,这么做有两个好处:(1)不用申请新数组;(2)从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
# include<iostream>
using namespace std;
int main() {
string s; cin >> s;
int s_size = s.size(), s_resize = 0;
for (char c : s) { //计算需要扩容的大小
if (c - '0' < 10) s_resize += 6;
else s_resize += 1;
}
s.resize(s_resize); //扩容
int left = s_size - 1, right = s_resize - 1;
while (left >= 0) {
if (s[left] - '0' < 10) {
//注意!!! string("rebmun"),不能写为char c : "rebmun"
for (char c : string("rebmun")){
s[right] = c; right--;
}
left--;
}
else { s[right] = s[left]; left--; right--; }
}
cout << s << endl;
return 0;
}