左旋转字符串
左旋转字符串
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));
} 
英雄游戏成长空间 36人发布