344. 反转字符串

双指针收缩

 1 class Solution {
 2 public:
 3     void reverseString(vector<char>& s) {
 4         int l = 0,r = s.size()-1;
 5         while(l < r){
 6             char tmp = s[l];
 7             s[l] = s[r];
 8             s[r] = tmp;
 9             l++;
10             r--;
11         }
12     }
13 };

541. 反转字符串 II

 1 class Solution {
 2 public:
 3     string reverseStr(string s, int k) {
 4         int n = s.size();
 5         for(int i = 0; i < n; i+=2*k){
 6             int l = i;
 7             int r = min(i+k-1, n-1);
 8             while(l < r){
 9                 char tmp = s[l];
10                 s[l] = s[r];
11                 s[r] = tmp;
12                 l++;
13                 r--;
14             }
15         }
16         return s;
17     }
18 };

54. 替换数字

统计数字个数,然后扩容

#include<iostream>
using namespace std;
int main(){
    string s;
    while(cin >> s){
        int count = 0,sOldSize = s.size();  // 数字的个数
        for(int i = 0; i < sOldSize; i++){
            if(s[i] >= '0' && s[i] <= '9')
                count++;
        }
        // 扩充字符串s的大小,也就是每个数字替换成"number"之后的大小
        s.resize(s.size() + count * 5);
        int sNewSize = s.size();
        // 从后先前将数字替换为"number"
        for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
            if (s[j] > '9' || s[j] < '0') {
                s[i] = s[j];
            } else {
                s[i] = 'r';
                s[i - 1] = 'e';
                s[i - 2] = 'b';
                s[i - 3] = 'm';
                s[i - 4] = 'u';
                s[i - 5] = 'n';
                i -= 5;
            }
        }
        cout << s << endl;
    }
    return 0;
}

151. 反转字符串中的单词

先把整个字符串反转,然后将空格间的单个单词反转,最后去掉多余的空格

class Solution {
public:
    // 删除多余空格.
    void removeExtraSpace(string& s){
        int slow = 0;
        int fast = 0;
        // 删除前面的空格.
        while(s.size() >0 && fast < s.size() && s[fast] == ' '){
            fast++;
        }
        // 去掉中间多余空格.
        for(;fast<s.size();fast++){
            if(fast-1 >0 && s[fast-1] == s[fast] && s[fast]==' '){
                continue;
            }else{
                s[slow++] = s[fast];
            }
        }
        // 去掉末尾空格.
        if(slow-1 >0 && s[slow-1]==' '){
            s.resize(slow-1);
        }else{
            s.resize(slow);
        }
    }
    string reverseWords(string s) {
        reverse(s.begin(), s.end());
        int index = 0;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == ' '){
                reverse(s.begin()+index, s.begin()+i);
                index = i+1;
            }
        }
        reverse(s.begin()+index, s.end());
        removeExtraSpace(s);
        return s;
    }
};

55. 右旋字符串

先整体反转再部分反转

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main(){
 5     int k;
 6     string s;
 7     cin >> k;
 8     cin >> s;
 9     int len = s.size();
10     reverse(s.begin(),s.end());// 整体反转
11     reverse(s.begin(),s.begin()+k);//部分反转
12     reverse(s.begin()+k,s.end());
13     std::cout << s << std::endl;
14     return 0;
15 }