/**
* 左旋转字符串
*
* 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,
* 请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。
*/
public class JZ043LeftRotateString {
/**
* 字符数组收尾交换
* @param str
* @param n
* @return
*/
public static String LeftRotateString(String str,int n) {
if (str == null || str.length() <= 0) {
return str;
}
if (n <= 0 || n >= str.length()) {
return str;
}
char[] ss = str.toCharArray();
reverseStr(ss, 0, n - 1);
reverseStr(ss, n, str.length() - 1);
reverseStr(ss, 0, str.length() - 1);
return new String(ss);
}
private static void reverseStr(char[] str, int start, int end) {
while (start < end) {
char tmp = str[start];
str[start] = str[end];
str[end] = tmp;
start++;
end--;
}
}
/**
* 最直观的方式,依次将需要移位的字符移动至最后,但是每个字符都需要移动数组的长度-1,如果数组的长度是n,需要移k位,则总共需要移动 k * (n - 1)
* @param str
* @param n
* @return
*/
public static String LeftRotateString2(String str,int n) {
if (str == null || str.length() <= 0) {
return str;
}
if (n <= 0 || n >= str.length()) {
return str;
}
char[] ss = str.toCharArray();
while (n > 0) {
for (int i = 0; i < ss.length - 1; i++) {
char tmp = ss[i];
ss[i] = ss[i + 1];
ss[i + 1] = tmp;
}
n--;
}
return new String(ss);
}
public static void main(String[] args) {
String str = "abcXYZ123";
System.out.println(LeftRotateString(str, 3));
System.out.println(LeftRotateString2(str, 3));
}
}