代码随想录算法训练营第八天 | 344.反转字符串 替换数字

344.反转字符串

题目链接 文章讲解 视频讲解

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

思路:双指针解决,和翻转数组一样

class Solution {
public:
    void reverseString(vector<char>& s) {
        int left = 0, right = s.size() - 1;
        while(left < right) {
            char ch = s[left];
            s[left] = s[right];
            s[right] = ch;
            ++left, --right;
        }
    }
};

541.反转字符串II

这道题我是直接开始快慢指针遍历,然后每次判断和k的关系,陷入到了复杂的判断逻辑中。
其实这道题只需要将i每次增加2k个就好了,因为忽略了string的随机访问特性,所以解题思路就狭隘了(应该在熟悉下stl)的常用方法

class Solution {
public:
    string reverseStr(string s, int k) {
        for(int i = 0; i < s.size(); i += 2 * k) {
            if(i + k < s.size()) {
                reverse(s.begin() + i, s.begin() + k + i);
            } else {
                reverse(s.begin() + i, s.end());
            }
        }
        return s;
    }
};

卡玛网54.替换数字

题目链接 文章讲解

tips: 这种替换某些字符的问题都可以扩容之后从后向前遍历

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)
#include <iostream>
using namespace std;

int main() {
    
    string s;
    while(cin >> s){
        int length = s.size() - 1;
        int count = 0;
        for(char ch : s) {
            if(ch >= '0' && ch <= '9') ++count;
        }
        s.resize(length + count * 5 + 1);
        int size = s.size() - 1;
        while(length >= 0){

            if(s[length] <= '9' && s[length] >= '0') {
                s[size--] = 'r';
                s[size--] = 'e';
                s[size--] = 'b';
                s[size--] = 'm';
                s[size--] = 'u';
                s[size--] = 'n';
            }else {
                s[size--] = s[length];
            }

            length--;
        }
        cout << s << endl;
    }
    return 0;
}

反转字符串

题目链接 文章讲解 视频讲解

tips:在做反转问题时,要有整体思想(整体反转+局部反转)

  • 时间复杂度 o(n);
  • 空间复杂度 o(1)
class Solution {
public:
    string reverseWords(string s) {
        // 去除多余的空格
        int fast = 0, slow = 0;
        while(fast < s.size()) {
            while(s[fast] == ' ' && fast < s.size()) ++fast;
            if(slow != 0 && fast < s.size()) s[slow++] = ' ';
            while(s[fast] != ' ' && fast < s.size()) {
                s[slow++] = s[fast++];
            } 
        } 
        // 更新字符串长度
        s.resize(slow);
        // 整体反转
        reverse(s.begin(), s.end());
        // 局部反转
        for(slow = 0, fast = 0; fast < s.size(); fast++) {
            while(s[fast] != ' ' && fast < s.size()) ++fast;
            reverse(s.begin() + slow, s.begin() + fast);
            slow = fast + 1;  
        }  
        return s;
    }
};

思路:在上一题我们学到了整体思想,这一题直接三次reverse秒掉

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    
    int k;
    cin >> k;
    string s;
    cin >> s;
    
    reverse(s.begin(), s.end());
    reverse(s.begin(), s.begin() + k);
    reverse(s.begin() + k, s.end());
    cout << s;
    return 0;
}
posted @ 2024-05-16 14:53  深蓝von  阅读(1)  评论(0编辑  收藏  举报