541-反转字符串 II

Posted angelica-duhurica

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了541-反转字符串 II相关的知识,希望对你有一定的参考价值。

541-反转字符串 II

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:

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

要求:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    // 不借助API,最快
    public String reverseStr(String s, int k) {
        char[] a = s.toCharArray();
        for (int start = 0; start < a.length; start += 2 * k) {
            int i = start;
            int j = Math.min(start + k - 1, a.length - 1);
            while (i < j) {
                char tmp = a[i];
                a[i++] = a[j];
                a[j--] = tmp;
            }
        }
        return new String(a);
    }
    public String reverseStr_2(String s, int k) {
        // 全部反转
        StringBuilder reverse = new StringBuilder(s).reverse();

        int len = s.length();
        int loop = len / (2 * k);
        int i = 0;

        StringBuilder res = new StringBuilder();
        while (loop > 0) {
            res.append(reverse, len - k - i, len - i).append(s, k + i, 2 * k + i);
            i += 2 * k;
            loop--;
        }

        int remain = len - i;
        if (remain < k) {
            res.append(reverse, 0, remain);
        } else {
            res.append(reverse, len - k - i, len - i).append(s, k + i, len);
        }
        return res.toString();
    }

比上面一个快点:只反转需要反转的部分

    public String reverseStr_1(String s, int k) {
        // 遍历,反转,拼接
        int len = s.length();
        int loop = len / (2 * k);
        StringBuilder res = new StringBuilder();
        while (loop > 0) {
            res.append(new StringBuilder(s.substring(0, k)).reverse()).append(s, k, 2 * k);
            s = s.substring(2 * k);
            loop--;
        }

        StringBuilder sb = new StringBuilder(s);
        if (sb.length() < k) {
            res.append(sb.reverse());
        } else {
            res.append(new StringBuilder(s.substring(0, k)).reverse()).append(s.substring(k));
        }
        return res.toString();
    }

以上是关于541-反转字符串 II的主要内容,如果未能解决你的问题,请参考以下文章

Java算法 每日一题 编号541:反转字符串 II

代码随想录算法训练营第8天 | ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 05.替换空格 ● 151.翻转字符串里的单词 ● 剑指Offer58-II.左旋转字符串

541-反转字符串 II

541-反转字符串 II

541. 反转字符串 II

541. 反转字符串 II