剑指Offer_编程题——左旋转字符串
题目描述:
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
具体要求:
时间限制: C/C++ 1秒,其他语言2秒
空间限制: C/C++32M,其他语言64M
具体实现:
思路一:
直接用暴力法,从开始截取n位,放到字符串后方。我们用java实现该思路:
public class Solution{
public static String LeftRotateString(String str, int n){
int len = str.length();
if(len == 0)
return "";
n %= len;
str += str;
return str.substring(n, len + n);
}
}
代码效果图如图所示:
此代码可以在牛客网上可以实现,但是我们如果在本地的话测试结果的话即得加上main函数,具体实现如下:
public static void main(String[] args) {
// TODO Auto-generated method stub
String string="abcXYZde";
String str_end=LeftRotateString(string,2);
System.out.println(str_end);
代码测试效果图如下:
接下来我们利用java字符串中的substring方法,只要简单的拼接即可,我们可以用java将其实现:
public class Solution{
public static String LeftRotateString(String str, int n){
if(str == "" || str == null || str.length() == 0)
return "";
String str1 = str.substring(n);
String str2 = str.substring(0, n);
String str3 = str1 + str2;
return str3;
}
}
代码效果图如图所示:
代码效果测试如下图所示:
思路二:
(1)先将左边3个字符串进行翻转:abcXYZdef --> cbaXYZdef
(2)再将右边剩余字符串进行翻转:cbaXYZdef --> cbafedZYX
(3)最后将整个字符串进行翻转: cbafedZYX --> XYZdefabc
接下来我们用java将其实现:
public class Solution{
public static String LeftRotateString(String str, int n){
if(str == null || str.length() < 2 || n <= 0)
return str;
n %= str.length();
if(n == 0)
return str;
char[] chs = str.toCharArray();
reverse(chs, 0, n - 1);
reverse(chs, n, str.length() - 1);
reverse(chs, 0, str.length() - 1);
return String.valueOf(chs);
}
public static void reverse(char[] chs, int left, int right){
while(left < right){
char temp = chs[left];
chs[left++] = chs[right];
chs[right--] = temp;
}
}
}
代码效果图如图所示:
代码测试结果如下图:
思路三:
我们用python中的.join()方法来实现,减少了代码的量。我们用python实现。
class Solution:
def LeftRotateString(self, s, n):
lt = list(s)
ns = lt[:n]
lt = lt[n:]
lt.extend(ns)
return "".join(lt)
代码效果图如图所示:
总结
本道题通过汇编语言的计算指数来考察我们对字符串的理解。我们对本题给出了三种解题思路,首先就是暴力解法,对字符串一一对比,接着优化了思路,就是用java中的substring方法,然后接着简单的连接即可,最后就是通过一种简单的反转即可实现,大大提高了运行速度以及缩短了代码量。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!