[leetCode]541. 反转字符串 II

csdn:https://blog.csdn.net/renweiyi1487/article/details/109330386

题目

链接:https://leetcode-cn.com/problems/reverse-string-ii

给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。

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

示例:

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

该字符串只包含小写英文字母。
给定字符串的长度和 k 在 [1, 10000] 范围内。

双指针

思路:计算字符串一共能以2k的长度分为几段,然后按照每段进行反转。每段处理完成后按照规则处理剩余部分。

class Solution {
    public String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();
        int n = chars.length;
        int section = n / (2*k);
        int  i = 0;
        while (i  < section) {
            int begin = i * 2 * k;
            int end = begin + k - 1;
            reverse(chars, begin, end);
            i++;
        }
        int leaveLen = n - (i * 2 * k);
        if (leaveLen <= k) {
            reverse(chars, i * 2 * k, n - 1);
        } else if (leaveLen < 2 * k && leaveLen >= k) {
            reverse(chars, i *2 * k, i * 2 * k + k - 1);
        }
        return new String(chars);
    }

    private void reverse(char[] chars, int begin, int end) {
        while (begin < end) {
            char temp = chars[begin];
            chars[begin] = chars[end];
            chars[end] = temp;
            begin++;
            end--;
        }
    }
}

另外一种写法,利用for循环分段处理

在for循环中利用i += (2 * k)即可分段处理

class Solution {
    public String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();
        int n = chars.length;
        for (int i = 0; i < n; i += 2*k) {
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= n) {
                reverse(chars, i, i + k - 1);
                continue;
            }
            // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
            reverse(chars, i,n-1);
        }
        return new String(chars);
    }

    private void reverse(char[] chars, int begin, int end) {
        while (begin < end) {
            char temp = chars[begin];
            chars[begin] = chars[end];
            chars[end] = temp;
            begin++;
            end--;
        }
    }
}
posted @ 2020-10-28 13:05  消灭猕猴桃  阅读(65)  评论(0编辑  收藏  举报