541. 反转字符串 II

题目

自己写的:

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.size();
        int cnt = 1;
        while (cnt * 2 * k <= n)
        {
            int t = (cnt - 1) * 2 * k;
            reverse(s.begin() + t, s.begin() + t + k);
            ++cnt;
        }
        int m = (cnt - 1) * 2 * k;
        if (n - m < k)
            reverse(s.begin() + m, s.begin() + n);
        else 
            reverse(s.begin() + m, s.begin() + m + k);
        return s;
    }
};

看了卡哥思路,思路更简洁,代码更简洁。

卡哥代码:

class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += (2 * k)) {
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= s.size()) {
                reverse(s.begin() + i, s.begin() + i + k );
            } else {
                // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                reverse(s.begin() + i, s.end());
            }
        }
        return s;
    }
};

另一种思路代码:

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.size(),pos = 0;
        while(pos < n){
            //剩余字符串大于等于k的情况
            if(pos + k < n) reverse(s.begin() + pos, s.begin() + pos + k);
            //剩余字符串不足k的情况 
            else reverse(s.begin() + pos,s.end());
            pos += 2 * k;
        }
        return s;
    }
};

这种思路似乎和我写的代码思路差不多,但是我的代码写复杂了,没必要定义一个cnt,直接用pos就可以。

posted @ 2025-01-14 20:58  hisun9  阅读(10)  评论(0)    收藏  举报