左旋轉(zhuǎn)字符串
題目描述
匯編語(yǔ)言中有一種移位指令叫做循環(huán)左移(ROL)存谎,現(xiàn)在有個(gè)簡(jiǎn)單的任務(wù)挺尾,就是用字符串模擬這個(gè)指令的運(yùn)算結(jié)果。對(duì)于一個(gè)給定的字符序列S,請(qǐng)你把其循環(huán)左移K位后的序列輸出蔓肯。例如遂鹊,字符序列S=”abcXYZdef”,要求輸出循環(huán)左移3位后的結(jié)果,即“XYZdefabc”蔗包。是不是很簡(jiǎn)單秉扑?OK,搞定它调限!
public class Solution {
/*解題思路:
reverse
(ArBr)r =((B)r)r((A)r)r=BA
假設(shè)原序列有n位舟陆,循環(huán)左移i位的過(guò)程如下:
(1)reverse(0,i-1);
(2)reverse(i,n-1);
(3)reverse(1,n-1);
例如原序列:abcdefg,循環(huán)左移3位:
(1)cba defg
(2)cba gfed
(3)defgabc
要記住一點(diǎn)就是STL中的迭代器是左閉右開(kāi)區(qū)間耻矮,所以reverse操作的第二個(gè)參數(shù)需要往后移動(dòng)一位*/
//首先將要移動(dòng)的部分看做第一部分秦躯,剩余部分為第二部分
//各自對(duì)第一部分,第二部分做翻轉(zhuǎn)操作
//最后再對(duì)整體做翻轉(zhuǎn)操作
public String LeftRotateString(String str,int n) {
if(str == null || str.length() ==0 || n <= 0){
return str;//返回原字符串
}
//將第一裆装、第二部分的下標(biāo)賦初值
int startIndex1 = 0;
int endindex1 = startIndex1 + n - 1;
int startIndex2 = endindex1 + 1;
int endIndex2 = str.length() - 1;
//翻轉(zhuǎn)第一部分
String firstReverse = Reverse(str,startIndex1,endindex1);
//翻轉(zhuǎn)第二部分
String secondReverse =Reverse(firstReverse,startIndex2,endIndex2);
//翻轉(zhuǎn)整體
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);
}
}