专栏首页用户7745800的专栏Day43:左旋转字符串

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Day52:正则表达式匹配

    一、背景知识介绍: 1、正则表达式:    在解题之前,我们先进行正则匹配的介绍,在维基百科中是这样介绍正则表达式的。正规表达式(Regular Expre...

    stefan666
  • Day53:表示数值的字符串

    一、背景知识介绍:   在做题之前,我们首先给大家介绍正则表达式,正则表达式在上一篇文章提到过,今天是因为会用到正则表达式,因此我们详细介绍正则表达式的应用。 ...

    stefan666
  • Day 2:替换空格

      本道题主要考察我们对字符串的替换以及遍历,我们可以通过replace()函数进行快速的写出代码,但是时间执行和空间占用较多,因此,我们得通过charAt()...

    stefan666
  • PHP对Json字符串解码返回NULL的一般解决方案

    php对json字符串解码使用json_decode()函数,第一个参数传字符串,第二个参数若为true,返回array;若为false,返回object。如果...

    用户7657330
  • R&Python Data Science系列:数据处理(5)--字符串函数基于R(一)

    数据根据结构可以分为结构化数据、非结构化数据和半结构化数据,前面介绍的数据处理函数针对于结构化数据,而字符串通常包含非结构化或者半结构化数据,这一部分介绍一下...

    1480
  • 【Codeforces】1230B - Ania and Minimizing

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    喜欢ctrl的cxk
  • Coderbyte-Challenger之Letter Capitalize(单词字母大写)

    Have the function LetterCapitalize(str) take the str parameter being passed and...

    chain
  • python str转bool方法

    py3study
  • Python3 与 C# 基础语法对比(String专栏)

    Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

    逸鹏
  • Python3 与 C# 基础语法对比(String专栏)

    Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

    逸鹏

扫码关注云+社区

领取腾讯云代金券