344.反转字符串
题目链接:344. 反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0, right = s.size() - 1;
while(left < right){
char temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
}
};
541. 反转字符串II
题目链接:541. 反转字符串 II
注意事项:
- 设计反转函数时使用引用,不然不能修改原函数
- 在循环内部注意边界条件的判断,以及确定好需要修改的位置
class Solution {
public:
void reverseString(string& s, int l, int r) {
int left = l, right = r;
while(left < right){
char temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
}
string reverseStr(string s, int k) {
int count = 0;
while(1){
if(count + 2*k <= s.size()){
reverseString(s, count, count + k - 1); //需要修改的地址不包含count+k所以要减一
count += 2*k;
}else if(s.size() - count < k){
reverseString(s, count, s.size() - 1);
break;
}else if(s.size() - count < 2*k && s.size() - count >= k){ //注意可以相等的情况
reverseString(s, count, count + k - 1);
break;
}
}
return s;
}
};
剑指 Offer 05. 替换空格
题目链接:剑指 Offer 05. 替换空格
注意事项:
- 单个字符使用单引号
- 不能未经扩容直接访问string后面的位置
- 计算扩充后的字符串长度时,并非直接加上三倍的空格数量,每个空格也是占一位。所以只需两倍即可
- 在循环时确定好哪个元素移动几位,操作的是哪个元素的位置
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
for(int i = 0; i < s.size(); i++){
if(s[i] == ' '){
count++;
}
}
int cur = s.size() - 1;
string add(2*count, ' ');
s = s + add;
int i = s.size() - 1;
while(cur >= 0){
if(s[cur] != ' '){
s[i] = s[cur];
cur--;
i--;
}else{
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 3;
cur--;
}
}
return s;
}
};
151. 反转字符串中的单词
题目链接:151. 反转字符串中的单词
注意事项:
- 注意整体的思路:
- 反转整个字符串
- 去除头尾及中间的多余空格,重新设置字符串大小
- 在每个单词字符串内部再反转回来
- 主要容易出问题的地方是第二步
class Solution {
public:
void fanzhuan(string &s, int l, int r){
int left = l, right = r;
while(left < right){
char temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
}
string reverseWords(string s) {
fanzhuan(s, 0, s.size() - 1);
int slow = 0;
for(int i = 0; i < s.size(); i++){
if(s[i] != ' '){//遇到非空格就处理,即将此部分非空格内容复制到slow地方。
if(slow != 0){//控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
s[slow++] = ' ';
}
while(i < s.size() && s[i] != ' '){//复制到slow处,遇到空格说明单词结束。
s[slow++] = s[i++];
}
}
}
s.resize(slow);
int left = 0, right = 0;
while(right < s.size()){
while(right < s.size() && s[right] != ' '){
right++;
}
fanzhuan(s, left, right - 1);
left = right + 1;
right++;
}
return s;
}
};
剑指 Offer 58 - II. 左旋转字符串
题目链接:剑指 Offer 58 - II. 左旋转字符串
注意事项:
- 理解巧妙的思路
class Solution {
public:
void fanzhuan(string &s, int l, int r){
int left = l, right = r;
while(left < right){
char temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
}
string reverseLeftWords(string s, int n) {
fanzhuan(s, 0, n - 1);
fanzhuan(s, n, s.size() - 1);
fanzhuan(s, 0, s.size() - 1);
return s;
}
};