[leetCode]剑指 剑指 Offer 58 - I. 翻转单词顺序、 II. 左旋转字符串

解法 双指针

使用两个指针定位每个单词,然后加入StringBuffer,最后转为字符串。

class Solution {
    public String reverseWords(String s) {
        if (s == null) return "";
        s = s.trim();
        if(s.length() == 0) return "";
        StringBuffer buffer = new StringBuffer();
        int begin = s.length() - 1 , end = begin;
        while (begin >= 0) {
            while(begin >=0 && s.charAt(begin) != ' ') --begin;
            buffer.append(s.substring(begin+1, end+1) + " ");
            while(begin >=0 && s.charAt(begin) == ' ') --begin;
            end = begin;
        }
        returan buffer.toString().trim();
    }
}

解法一

直接利用javaAPI即可完成左旋

class Solution {
    public String reverseLeftWords(String s, int n) {
        if (s == null || n >= s.length()) return s;
        StringBuffer sb = new StringBuffer();
        sb.append(s.substring(n, s.length()));
        sb.append(s.substring(0, n));
        return sb.toString();
    }
}

翻转

将字符串分为两部分:[0,n)、[n,length)。将这两部分各自 翻转然后将整个字符串翻转即可完成左旋

class Solution {
    public String reverseLeftWords(String s, int n) {
        if (s == null || n >= s.length()) return s;
        char[] chars = s.toCharArray();
        reverse(chars, 0, n-1);
        reverse(chars, n, chars.length - 1);
        reverse(chars, 0, chars.length - 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-09-22 10:15  消灭猕猴桃  阅读(63)  评论(0)    收藏  举报
编辑推荐:
· 35+程序员的转型之路:经济寒冬中的希望与策略
· JavaScript中如何遍历对象?
· 领域模型应用
· 记一次 ADL 导致的 C++ 代码编译错误
· MySQL查询执行顺序:一张图看懂SQL是如何工作的
阅读排行:
· 35+程序员的转型之路:经济寒冬中的希望与策略
· 使用 OpenAuth.Net 快速搭建 .NET 企业级权限工作流系统
· 一款开源免费、通用的 WPF 主题控件包
· .NET 9 + React 开发的企业级后台权限管理系统,文档齐全,轻松上手
· 神解释:为什么程序员怕改需求?
点击右上角即可分享
微信分享提示