Day43:左旋转字符串

时间:2022-07-24
本文章向大家介绍Day43:左旋转字符串,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指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!!!

参考文献

[1] 白马长枪儒雅将 [2] NeoJoe [3] DarrenXf