题目描述
对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。
基本思路
首先定义“翻转字符串”为整个字符串从后往前读取。例如,“abcdef”翻转后为“fedcba”。
对于字符串有特性:翻转两次之后,回到原顺序。
- 利用这一特性,我们首先将字符串分为两部分:要放在后面的“abc”为第一部分,“XYZdef”为第二部分。
- 分别先翻转两个部分为“cba”和“fedZYX”,此时字符串为“cbafedZYX”。
- 再翻转全字符串恢复两部分的顺序,可得“XYZdefabc”。
以下为具体解答:
public String LeftRotateString(String str,int n) {
if (str == null) {
return null;
} else if (str.length() == 0 || n <= 0) {
return str;
}
n = n % str.length();
char[] chars = str.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[] str, int start, int end) {
if (start >= end || str == null || str.length == 0) {
return;
}
int mid = (start + end) / 2;
while(start <= mid) {
char tmp = str[end];
str[end] = str[start];
str[start] = tmp;
start++;
end--;
}
}