题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
小白思路:StringBuffer实现
有点开心,这次想到的思路是高分答案的思路
利用StringBuffer实现,思路很简单,将字符串重新拼装。
public class Solution {
public String LeftRotateString(String str,int n) {
if(n < 0 || n > str.length())
return "";
if(str == null || str.length() <= 0)
return "";
StringBuffer buffer1 = new StringBuffer(str);
StringBuffer buffer2 = new StringBuffer(str);
StringBuffer buffer3 = new StringBuffer();
buffer1.delete(0,n);
buffer2.delete(n,str.length());
buffer3.append(buffer1.toString()).append(buffer2.toString());
return buffer3.toString();
}
}
其他思路:
先分别翻转前半部分字符串和后半部分字符串,最后翻转整个字符串即可。
例如:输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab";
第一步:翻转字符串“ab”,得到"ba";
第二步:翻转字符串"cdefg",得到"gfedc";
第三步:翻转字符串"bagfedc",得到"cdefgab";
或者:第一步:翻转整个字符串"abcdefg",得到"gfedcba"
第二步:翻转字符串“gfedc”,得到"cdefg"
第三步:翻转字符串"ba",得到"ab"
PS: 补充String类基础知识
一、String基本操作方法
字符串的基本操作方法中包含以下几种:
(1)获取字符串长度length() : int length = str.length();
(2)获取字符串中的第i个字符charAt(i) : char ch = str.charAt(i);
(3)获取指定位置的字符方法getChars(4个参数) :
char array[] = new char[80]; //先要创建以一个容量足够大的char型数组,数组名为array
str.getChars(indexBegin,indexEnd,array,arrayBegin);
括号中四个参数的指向意义:
1、indexBegin:需要复制的字符串的开始索引
2、 indexEnd: 需要复制的字符串的结束索引,indexEnd-1
3、array: 前面定义的char型数组的数组名
4、arrayBegin:数组array开始存储的位置索引号
二、字符串比较
字符串的比较是将两个字符串从左到右逐个字符逐个字符进行比较,比较的依据是当前字符的Uncode编码值,直到比较出两个不同字符的大小。
字符串比较也分为两大类:一类是字符串大小的比较,这样的比较有三种结果,大于、等于以及小于;还有一类比较方法就是比较两个字符串是否相等,这样产生的比较结果无非就两种,ture和false。
1、比较大小:
(1)不忽略字符串大小写情况下字符串的大小比较方法compareTo(another str)
格式:int result = str1.compareTo(str2);
(2) 忽略字符串大小写情况下字符串的大小比较方法compareTOIgnoreCase(another str)
格式:int result = str1.compareToIgnoreCase(str2);
2、判别两种字符串是否相等(相等情况下必须保证二者长度相等)需求中的方法:
(1)不忽略字符串大小写情况下判别字符串相等的方法eaquals(another str)
格式:boolean result = str1.equals(str2);
当且仅当str1和str2的长度相等,且对应位置字符的Unicode编码完全相等,返回true,否则返回false
(2) 忽略字符串大小写情况下判别字符串相等的方法equalsIgnoreCase(another str)
格式:boolean result = str1.equals(str2);
三、字符串查找
在一段很长的字符串中查找需要的其中一部分字符串或者某个字符,String类恰恰提供了相应的查找方法,这些方法返回的都是目标查找对象在字符串中的索引值,所以都是整形值。具体分类情况如下:
字符串查找无非分为两类:查找字符串和查找单个字符,而查找又可分为查找对象在字符串中第一次出现的位置和最后一次出现的位置,再扩展一步,我们可以缩小查找范围,在指定范围之内查找其第一次或最后一次出现的位置。
查找字符或字符串出现的位置
1、indexOf()方法
格式:1、str.indexOf(ch);
2、str.indexOf(ch,fromIndex);
//包含fromIndex位置
格式1返回指定字符在字符串中第一次出现位置的索引
格式2返回指定索引位置之后第一次出现该字符的索引号
2、lastIndexOf()方法
格式:1、str.lastIndexOf(ch);
2、str.lastIndexOf(ch,fromIndex);
格式1返回指定字符在字符串中最后一次出现位置的索引
格式2返回指定索引位置之前最后一次出现该字符的索引号
四:截取与拆分
截取出一个长字符串中的一个子字符串或将字符串按照正则表达式的要求全部拆分保存到一个字符串数组中。具体方法如下所示:
(1) 截取方法
1、substring()方法
格式1:String result = str.substring(index);
格式2:String result = str.substring(beginIndex,EndIndex);
//实际索引号[beginIndex,EndIndex-1]
结果:截取出范围内的字符串
(2)拆分方法
1、split()方法
格式1 :String strArray[] = str.split(正则表达式);
// 拆分的结果保存到字符串数组中
格式2:String strArray[] = str.split(正则表达式,limit);
五、替换或修改
对原字符串中的某些子字符串进行替换或修改
(1)concat()方法:合并字符串
格式:String result = str1.concat(str2); //将str1和str2合并
(2) toLowerCase()方法:将字符全部转化为小写
格式: String result = str.toLowerCase();
(3) toUpperCase()方法: 将字符全部转化为大写
格式:String result = str.toUpperCase();
(4)replaceAll()、replaceFirst()方法:需要匹配正则表达式
“对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”。
相关StringBuffer和StringBuilder的知识点在:https://www.cnblogs.com/dolphin0520/p/3778589.html中有详细叙述。