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();
    }

最新文章

  1. Python基础5:列表 元祖 字典 集合
  2. 【转载】jQuery1.5之后的deferred对象详解
  3. AngularJS学习笔记一:简单入门
  4. Permutations [LeetCode]
  5. http meta
  6. jquery学习以及下载链接
  7. Myeclipse在启动Tomcat服务器的时候总是进入debug视图的解决方法
  8. 修改 “嗨加游-Prefix.pch” 或者 “嗨加游-Info.plist ” 方法
  9. openGL的使用步骤
  10. 关于并发,关于IIS你真的了解吗?(一)
  11. 《java入门第一季》之面向对象
  12. JavaScript基础系列
  13. expansion pattern ‘Frame&amp;’ contains no argument packs
  14. python摸爬滚打之day022----模块(序列化操作)
  15. CSS3 transform 属性
  16. ajaxFileupload 多文件上传
  17. SpringMVC系列(二): SpringMVC各个注解的使用
  18. QT编译错误:invalid application of &#39;sizeof&#39; to incomplete type &#39;Qt3DRender::QPickEvent&#39;
  19. [转载]Windows服务编写原理及探讨(2)
  20. office 文档转pdf

热门文章

  1. C#代码实现-冒泡排序
  2. Windows Server 2012 R2的安装(GUI桌面版本)
  3. python基础练习,循环、列表、字典、数组
  4. 两张图搞清楚Eclipse上的Web项目目录
  5. C语言再学习part3—算法
  6. vue(二)--条件语句
  7. Mac下maven安装
  8. 基于XML的声明式事务控制
  9. Android注册时验证码的生产方法
  10. java Socket通信,客户端与服务端相互发消息