《剑指offer》面试题58(2)

题目:左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。实现一个函数完成字符串的左旋转功能。比如,输入abcdefg和数字2,输出为cdefgab。


思路:

1.以“abcdefg”为例,我们可以把它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分到第一部分,把后面的所有字符分到第二部分。我们先分别翻转这两部分,于是就得到“bagfedc”。
2.接下来翻转整个字符串,得到的“cdefgab”就是把原始字符串左旋转两位的结果。
此思路类似于矩阵中(AB)的转置问题。

基于以上思路,java参考代码如下:

public class Test {
	public static String LeftRotateString(String str,int k) {
		if(str==null||k<0)
			return str;//注意点1:特殊情况直接返回原字符串
		if(k>str.length())//注意点2:当长度超过字符串长度时,可以认为移动整数倍的长度相当于没有移动
			k=k%str.length();
		StringBuilder string=new StringBuilder(str);//需要构造StringBuilder,可以在字符串的指定位置插入元素,而String没有此功能
		reverse(string,0,k-1);//转置前k个字符
		reverse(string,k,str.length()-1);//转置K以后的字符
		reverse(string,0,str.length()-1);//整体转置
		return string.toString();
	}
	
	//翻转string[start,end]
	public static void reverse(StringBuilder string,int start,int end) {
		for(int i=start;i<=start+(end-start)>>1;i++) {
			char temp=string.charAt(i);
			string.setCharAt(i, string.charAt(end-i+start));
			string.setCharAt(end-i+start, temp);
		}
	}

	public static void main(String[] args) {
		int k=2;
		String st=LeftRotateString(new String("abcdefg"),k);
		System.out.print(st);
	}		
}

注意点见代码注解部分。

测试用例:

a.功能测试(把长度为n的字符串左旋转0个字符、1个字符、2个字符、n-1个字符、n个字符、n+1个字符)。
b.特殊输入测试(字符串的指针为nullptr指针)。

参考:

https://www.jianshu.com/p/c2f062b59bda

猜你喜欢

转载自blog.csdn.net/qq_43502142/article/details/87881535