题目链接
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列 S ,请你把其循环左移 K 位后的序列输出。例如,字符序列 S = ”abcXYZdef” , 要求输出循环左移 3 位后的结果,即 “XYZdefabc”
数据范围:输入的字符串长度满足 0≤len≤100 , 0≤n≤100
进阶:空间复杂度 O(n) ,时间复杂度 O(n)
题目示例
示例1
输入:
“abcXYZdef”,3
返回值:
“XYZdefabc”
示例2
输入:
“aab”,10
复制
返回值:
“aba”
思路一
按照题目将字符串转为字符数组,然后将最左侧字符保存起来,将其他字符左移,然后再将刚才的字符放到最右侧,即可完成一次左旋转字符串,循环进行n次即可左移n位
需要注意的是,如果n为0则直接返回该字符串,如果n大于str的长度,那么需要将 n %= str.length()
方法一代码
public class Solution {
public String LeftRotateString(String str,int n) {
if(str.length() == 0 || n == 0){
return str;
}
n %= str.length();
char[] chars = str.toCharArray();
while(n != 0){
LeftRotate(chars);
n--;
}
return new String(chars);
}
private void LeftRotate(char[] chars) {
char ch = chars[0];
for(int i = 0; i < chars.length - 1; i++){
chars[i] = chars[i + 1];
}
chars[chars.length - 1] = ch;
}
}
思路二
如果需要循环左移n位,那么可以先将str的左侧n位进行逆置,再将右侧的str.length() - n位进行逆置,最后将整个str逆置即可得到正确答案
例如:
方法二完整代码
public class Solution {
public String LeftRotateString(String str,int n) {
if(str.length() == 0 || n == 0){
return str;
}
n %= str.length();
char[] list = str.toCharArray();
reverse(list, 0, n - 1);
reverse(list, n, str.length() - 1);
reverse(list, 0, str.length() - 1);
return new String(list);
}
private void reverse(char[] list, int start, int end) {
while(start < end){
char tmp = list[start];
list[start] = list[end];
list[end] = tmp;
start++;
end--;
}
}
}