题目链接
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列 S ,请你把其循环左移 K 位后的序列输出。例如,字符序列 S = ”abcXYZdef” , 要求输出循环左移 3 位后的结果,即 “XYZdefabc” 。
输入输出
示例1:
输入:
"abcXYZdef",3
返回值:
"XYZdefabc"
示例2:
输入:
"aab",10
返回值:
"aba"
题目分析
方法一:
- n 表示左移次数,当
n=str.length()
时,字符串又恢复原样,所以可以通过step = n%str.length()
进行去重,得到需要移动的次数step. - 通过toCharArray()把字符串str转化为数组,更容易操作
- 保存数组的第一个字符,剩下的整体前移一个,再把第一个放在最后,完成一次移动,一次能移动,利用循环完成多次
代码运行
public class Solution {
public String LeftRotateString(String str,int n) {
if(str.length()==0||n==0){
return str;
}
char[] ch = str.toCharArray();
int len = ch.length;
int step = n%len;//去重
while(step>0){
step--;
char tmp = ch[0];//先把第一个数暂时放在tmp处
int i = 0;
while(i<(len-1)){
ch[i] = ch[i+1];//把后面的数一位一位的往前移,最后一个位置会空出来
i++;
}
ch[len-1] = tmp;//把暂存起来的值放在最后一个位置
}
return new String(ch);
}
}
方法二:
- 局部逆置:对[0,step-1]范围之间的字符进行逆置,再对余下的字符进行逆置
- 整体逆置:对字符串整体进行逆置
如:
String str = " 123abc ", n = 2
左移两位结果是:3abc12
操作步骤: [0,step-1]逆置:213abc
------>余下的字符进行逆置:21cba3
------>整体逆置:3abc12
运行代码
public class Solution {
public void reverse(char[] ch,int start,int end){
while(start<end){
char tmp = ch[start];
ch[start] = ch[end];
ch[end] = tmp;
start++;
end--;
}
}
public String LeftRotateString(String str,int n) {
if(str.length()==0||n==0){
return str;
}
char[] ch = str.toCharArray();
int len = ch.length;
int step = n%len;//去重
reverse(ch,0,step-1);
reverse(ch,step,len-1);
reverse(ch,0,len-1);
return new String(ch);
}
}