左旋转字符串

左旋转字符串

https://www.nowcoder.com/questionTerminal/12d959b108cb42b1ab72cef4d36af5ec

解题

解法一

三次翻转。把字符串分成两部分处理,需要左移和不需要移动。两部分分别翻转,然后再翻转整个字符。


abc XYZdef
cba fedZYX
XYZ defabc


public class Solution {

    public String LeftRotateString(String str, int n) {
        if (str.length() == 0 || n <= 0)
            return "";
        n = n % str.length();
        char[] ch = str.toCharArray();
        reverse(ch, 0, n - 1);
        reverse(ch, n, ch.length - 1);
        reverse(ch, 0, ch.length - 1);
        return new String(ch);
    }

    private void reverse(char[] ch, int i, int j) {
        while (i < j){
            char tmp = ch[i];
            ch[i++] = ch[j];
            ch[j--] = tmp;
        }
    }
}

解法二

利用 Java 的 substring() 方法, S 左移 K 位,相当于 S.substring(K, S.length()) + S.substring(0, S.length()), 同时要考虑 S.length() < K 的情况。

public class Solution {
    public String LeftRotateString(String str, int n) {
        if (str.length() == 0 || n <= 0)
            return "";
        n = n % str.length();
        return str.substring(n, str.length()) + str.substring(0, n);
    }
}

测试用例

public static void main(String[] args) {
    Solution s = new Solution();
    System.out.println(s.LeftRotateString("abcXYZdef", 3));
    System.out.println(s.LeftRotateString("abcXYZdef", 9));
    System.out.println(s.LeftRotateString("abcXYZdef", 15));
    System.out.println(s.LeftRotateString("", 3));
    System.out.println(s.LeftRotateString("abcXYZdef", -1));
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务