题目
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
示例
Input:
S="abcXYZdef"
K=3
Output:
"XYZdefabc"
思路
1、直接解决,将字符串分割为两个字串,交换两个字串的顺序(但该方法占用内存空间较大)。
public String LeftRotateString(String str,int n) {
if (str == null || str.length() <= n)
return str;
String s1 = str.substring(0, n);
String s2 = str.substring(n);
return s2 + s1;
}
2、结合【剑指 Offer 题解】58.1 翻转单词顺序列 ,扩展本题
- 将本题的输入 “abcXYZdef”,3 看作由题目58.1 的输入"abc XYZdef"
- 先将 “abc” 和 “XYZdef” 分别翻转,得到 “cbafedZYX”,然后再把整个字符串翻转得到 “XYZdefabc”
public String LeftRotateString(String str,int n) {
if (str == null || str.length() <= n)
return str;
char[] chars = str.toCharArray();
reverse(chars, 0, n - 1);
reverse(chars, n, str.length() - 1);
reverse(chars, 0, str.length() - 1);
return new String(chars);
}
private void reverse(char[] chars, int start, int end) {
for (int i = start,j = end; i < j; i++, j--) {
swap(chars, i, j);
}
}
private void swap(char[] chars, int i, int j) {
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}