左旋转字符串
左旋转字符串
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)); }