344
第一思路
双指针一个指向头部,一个指向尾部,然后交换两个的位置
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0, j = s.size() - 1;
while ( i < j) {
swap(s[i], s[j]);
i++;
j--;
}
}
};
一次ac
541
第一思路
外层一个指针一次移动2k,然后双指针法反转前k个
class Solution {
public:
string reverseStr(string s, int k) {
// 思路:外层一个指针一次移动2k,然后双指针法反转前k个
for ( int i = 0; i < s.size(); i+=2*k){
if ( i + k > s.size()) { // 剩余字符少于k
int left = i;
int right = s.size() - 1;
while ( left < right) {
swap(s[left], s[right]);
left++;
right--;
}
break;
}
// if ( i + k < s.size() && i + 2*k > s.size()){
// int left = i;
// int right = i + k - 1;
// while (left < right) {
// swap(s[left], s[right]);
// left++;
// right--;
// }
// }
// int l = i;
// int r = i + k - 1; //好像跟上面可以合并
int left = i;
int right = i + k - 1;
while (left < right) {
swap(s[left], s[right]);
left++;
right--;
}
}
return s;
}
};
一次ac
05
一开始没想到不消耗额外辅助空间的方法,看到题解思路后一次ac
总结
倒叙替换
151
总结 数组变长,从右往左遍历,数组变短,从左往右
58
class Solution {
public:
int lengthOfLastWord(string s) {
// 思路,去除多余空格,然后resize,然后倒叙遍历
// 去除多余空格
int slow = 0;
for (int fast = 0; 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);
int count = 0;
for ( int i = s.size() - 1; i >= 0; i--) {
if (s[i] != ' ') count++;
else break;
}
return count;
}
};
一次AC