一、题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
二、分析
有两种方法可以解决它
方法一
1、假设S=”abcXYZdef”,n=3,循环左移的结果为"XYZdefabc",则设X=abc,Y=XYZdef,我们把X,Y反转,用XT表示reverse方法,即XT=cba,YT=fedZYX,XT+YT=cbafedZYX,(XT+YT)T=XYZdefabc,结果即为所求,故整个过程需要三次反转,也就是三次reverse,前两次为局部,最后一次为全局。
实现代码如下:
public class Solution {
public String LeftRotateString(String str,int n) {
if(str == null || str.length() == 0){
return str;
}
char[] chars = str.toCharArray();
//反转3次
reverse(chars, 0, n-1);
reverse(chars, n, chars.length-1);
reverse(chars, 0, chars.length-1);
return new String(chars);//返回用chars创建的String对象
}
public void reverse(char[] chars, int i, int j){
while(i < j){
char temp = chars[i];
chars[i++] = chars[j];
chars[j--] = temp;
}
}
}
方法二
2.1
使用java中的subString,这是小技巧,我们主要还是要掌握方法1,subString就是先将原来的str扩展到自身两倍,即两个相同的str连接起来。然后取n到str.length+n的字符串。如两倍的字符串即为"abcXYZdefabcXYZdef",n=3,那么n到str.length+n,就是XYZdefabc。
实现代码如下:
public class Solution {
public String LeftRotateString(String str,int n) {
if(str == null || str.length() == 0){
return str;
}
String str2 = str + str;
return str2.substring(n, str.length() + n);
}
}
2.2
或者直接取两次局部的字符串进行连接。也就是取XYZ和defabc两个部分再拼接。
实现代码如下:
public class Solution {
public String LeftRotateString(String str,int n) {
if(str == null || str.length() == 0){
return str;
}
//注意subString截取方法是左闭右开,所以右边才往后取一位
return str.substring(n,str.length()) + str.substring(0,n);
}
}