题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
import java.util.Scanner;
public class LeftRotateString {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("input the number of leftRotate:");
int n = sc.nextInt();
System.out.println("input the String:");
String s = sc.next();
System.out.println("results:" + LeftRotateString1(s, n));
}
// 方法1: 复杂度 o(n^2)
public static String LeftRotateString(String str, int n) {
int len = str.length();
char[] c = str.toCharArray();
if (len == 0) {
return "";
}
n %= len; // 每个元素右移len位回到原来位置上
while (n != 0) {
char temp = c[0]; // 保留首字符
for (int i = 0; i < len - 1; i++) {
c[i] = c[i + 1];
}
c[len - 1] = temp;
n--;
}
return new String(c);
}
// 方法2: 三步翻转法
public static String LeftRotateString1(String str, int n) {
int len = str.length();
char[] c = str.toCharArray();
if(len == 0){
return "";
}
n %= len;
reverse(c, 0, n - 1); //翻转左半部分
reverse(c, n, len - 1);//翻转右半部分
reverse(c, 0, len - 1);//翻转全部
return new String(c);
}
public static void reverse(char[] c, int left, int right) {
for (int i = left, j = right; i < j; i++, j--) {
char temp = c[i];
c[i] = c[j];
c[j] = temp;
}
}
}