LeetCode541.反转字符串 II

题目

541.反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 104
  • s 仅由小写英文组成
  • 1 <= k <= 104

代码

class Solution {
    
    
public:
    string reverseStr(string s, int k) {
    
    
        // 计算有多少个(2k)
        int n = int(s.length()) / (2 * k);
        // 计算剩余字符数
        int remain = int(s.length()) - (2 * k) * n;

        //对每个(2k)中前k个字符反转
        for (int i = 0; i < n; i++) {
    
    
            for (int left = 0 + (2 * k) * i, right = k - 1 + (2 * k) * i; left < right; left++, right--) {
    
    
                swap(s[left], s[right]);
            }
        }

        // 剩余字符小于k个,则将剩余字符全部反转
        if (0 < remain && remain < k) {
    
      //注意if中条件!!!
            for (int a = 2 * k * n, b = remain - 1 + 2 * k * n; a < b; a++, b--) {
    
    
                swap(s[a], s[b]);
            }
        }

        // 剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
        if (k <= remain && remain < 2 * k) {
    
      //注意if中条件!!!
            for (int left = 2 * k * n, right = k - 1 + 2 * k * n; left < right; left++, right--) {
    
    
                swap(s[left], s[right]);
            }
        }

        return s;
    }
};

猜你喜欢

转载自blog.csdn.net/Star_ID/article/details/125200705