左旋转字符串
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
public class Solution {
/*解题思路:
reverse
(ArBr)r =((B)r)r((A)r)r=BA
假设原序列有n位,循环左移i位的过程如下:
(1)reverse(0,i-1);
(2)reverse(i,n-1);
(3)reverse(1,n-1);
例如原序列:abcdefg,循环左移3位:
(1)cba defg
(2)cba gfed
(3)defgabc
要记住一点就是STL中的迭代器是左闭右开区间,所以reverse操作的第二个参数需要往后移动一位*/
//首先将要移动的部分看做第一部分,剩余部分为第二部分
//各自对第一部分,第二部分做翻转操作
//最后再对整体做翻转操作
public String LeftRotateString(String str,int n) {
if(str == null || str.length() ==0 || n <= 0){
return str;//返回原字符串
}
//将第一、第二部分的下标赋初值
int startIndex1 = 0;
int endindex1 = startIndex1 + n - 1;
int startIndex2 = endindex1 + 1;
int endIndex2 = str.length() - 1;
//翻转第一部分
String firstReverse = Reverse(str,startIndex1,endindex1);
//翻转第二部分
String secondReverse =Reverse(firstReverse,startIndex2,endIndex2);
//翻转整体
return Reverse(secondReverse,startIndex1,endIndex2);
}
private String Reverse(String oriStr,int start,int end){
char [] array = oriStr.toCharArray();
while(start < end){
char temp = array[start];
array[start] = array[end];
array[end] = temp;
++start;
-- end;
}
return new String(array);
}
}