class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0, right = s.size() - 1;
while(left < right) {
swap(s[left++], s[right--]);
}
}
};
本题小结:采用双指针法,可以使用swap函数
此题中swap函数的实现原理可以通过位运算得到
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
class Solution {
public:
string reverseStr(string s, int k) { //以2k为周期,如果能凑出k个,将前k个元素进行反转;如果凑不齐,反转到最后一个元素。
for(int i = 0; i < s.size(); i += 2*k) {
if(i + k <= s.size()) { //至少能凑出k个
reverse(s.begin() + i, s.begin() + i + k);
continue;
}
else //凑不出k个
reverse(s.begin() + i, s.end());
}
return s;
}
};
本题小结:以2k为周期,以k个长度为界限进行反转。
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
int sOldsize = s.size();
//1.统计空格个数
for(char a : s) {
if(a == ' ')
count++;
}
//2.扩展长度
s.resize(sOldsize + 2 * count);
int sNewsize = s.size();
//3.双指针替换空格
for(int i = sNewsize, j = sOldsize; j < i; i--, j--) {
if(s[j] == ' ') {
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
else
s[i] = s[j];
}
return s;
}
};
本题小结:本题关键在于思考为什么要从后往前进行替换,因为只需要替换由空格带来的部分,前面内容无需替换
class Solution {
public:
//首先去除字符串中多余空格
void removeExtraSpaces(string& s) {
//使用双指针进行移除
int slowIndex = 0, fastIndex = 0;
while(s.size() > 0 && s[fastIndex] == ' ' && fastIndex < s.size()) //移除前导空格
fastIndex++;
for(; fastIndex < s.size(); fastIndex++) { //去除字符中的重复空格
if(fastIndex - 1 > 0 && s[fastIndex] == s[fastIndex - 1] && s[fastIndex] == ' ')
continue;
else {
s[slowIndex++] = s[fastIndex];
}
}
//去除末尾的空格
if(slowIndex - 1 && s[slowIndex - 1] == ' ')
s.resize(slowIndex - 1);
else
s.resize(slowIndex);
}
void reverse(string& s, int start, int end) {
for(int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(s, 0, s.size() - 1);
int start = 0;
for(int i = 0; i <= s.size(); i++) {
if(i == s.size() || s[i] == ' ') {
reverse(s, start, i - 1);
start = i + 1;
}
}
return s;
}
};
本题小结:首先移除多余空格,然后将整个字符串反转,最后将将每个单词反转。
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
reverse(s.begin(), s.end());
return s;
}
};
本题小结:反转区间为前n的子串,反转区间为n到末尾的子串,反转整个字符串