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
- Flash/Flex学习笔记(10):FMS 3.5之Hello World!
- Swarm基于多主机容器网络-overlay networks 梳理
- 未来AI可能会淘汰180万个工作岗位,你感到恐惧了吗
- css基础:把所有背景图都集成在一张图片上,减少图片服务器请求次数
- Docker可视化界面(Consul+Shipyard+Swarm+Service Discover)部署记录
- windows 2008上启用防火墙后sqlserver 2005经常出现连接超时的解决办法
- 重温delphi之控制台程序:Hello World!
- Docker集中化web界面管理平台-Shipyard部署记录
- "Goole项目托管"及"CodePlex发布开源项目"要点
- Docker网络解决方案-Calico部署记录
- c#中开发ActiveX的学习笔记
- Android新手之旅(4) 通过HTTP访问web
- Flash/Flex学习笔记(9):ActionScript3.0与Javascript的相互调用
- Flash/Flex学习笔记(8):ActionScript3.0中的面对对象
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在 Linux 中不使用 CD 命令进入目录/文件夹的方法
- 探索Linux内核:Kconfig的秘密
- Linux中使用命令more,less,cat查看文件内容
- SSH的ssh-keygen命令基本用法详解
- 图文详解Ubuntu搭建Ftp服务器的方法(包成功)
- Linux中chown与chmod两个命令的区别详解
- 解决navicat连接不上linux服务器上的mysql问题
- 增强Linux和Unix服务器安全性的方法详解
- ubuntu下没有中文输入法的解决办法
- linux查看端口是否开放的方法总结
- Linux下删除乱码或特殊字符文件的方法讲解
- Ubuntu Server下无线网卡的配置详解
- Linux中修改mysql默认编码的方法步骤
- ubuntu16.04搭建nfs服务的方法
- Ubuntu16.04搭建php5.6Web服务器环境