344. 反转字符串
笔记
从两边遍历,将两边的值互相交换。
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0;
int right = s.size() - 1;
while(left < right) {
int tem = s[left];
s[left] = s[right];
s[right] = tem;
left++;
right--;
}
return;
}
};
541. 反转字符串 II
笔记
遍历的时候每次跳2*k步,若之后的字符个数大于k,则反转k个字符串,否则全部反转。
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += 2 * k) {
if (s.size() - i < k) {
reverse(s.begin() + i, s.end());
}
else {
reverse(s.begin() + i, s.begin() + i + k);
}
}
return s;
}
};
344. 剑指 Offer 05. 替换空格
笔记
记录空格的个数,扩容字符串,从后向前遍历,遇到空格替换为%20。
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
int size = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') count++;
}
s.resize(s.size() + count * 2);
int tarIndex = s.size() - 1;
for (int srcIndex = size - 1; srcIndex >= 0; srcIndex--, tarIndex--) {
if (s[srcIndex] == ' ') {
s[tarIndex] = '0';
s[tarIndex - 1] = '2';
s[tarIndex - 2] = '%';
tarIndex -= 2;
}
else {
s[tarIndex] = s[srcIndex];
}
}
return s;
}
};
151. 反转字符串中的单词
笔记
先去除多余的空格(这里遍历的是单词,而不是单个字符)。
反转整个字符串,然后依次反转单词。
class Solution {
public:
string reverseWords(string s) {
int slow = 0;
int fast = 0;
while (fast < s.size()) {
if (s[fast] != ' ') {
if (slow != 0) s[slow++] = ' ';
while (s[fast] != ' ' && fast < s.size()) {
s[slow] = s[fast];
slow++;
fast++;
}
}
fast++;
}
s.resize(slow);
reverse(s.begin(), s.end());
slow = 0;
fast = 0;
while (fast <= s.size()) {
if (s[fast] == ' ' || fast == s.size()) {
reverse(s.begin() + slow, s.begin() + fast);
slow = fast + 1;
}
fast++;
}
return s;
}
};
剑指 Offer 58 - II. 左旋转字符串
笔记
略。
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin() + s.size() - n);
reverse(s.begin() + s.size() - n, s.end());
return s;
}
};