字符串循环左移问题

问题描述:给定一个长度为n的字符串,循环左移l位得到一个新的字符串,求新字符串。限制:空间复杂度尽量低。

方法一:思路:空间复杂度尽量低,要求程序中珍惜每个分配的空间,以abcdef为例,如果左移两位,则非常明显答案为cdefab

  步骤一:逐位移动,即将c移到第一位的时候,需要记录下a,并且c的原位置无用了,可以利用来计算移到原来c位置的字符,即e.同时e的原位置可以利用了,如此做下去……

  步骤二:结束条件,这样做需要判断何时结束,由做法可以知道,每次移动都是将一个元素移动到目的位置了,所以移动的次数一定不会大于元素个数,且最后还需要将放在辅助空间中的字符放在正确的位置,故结束条件为移动次数 = n-1;

  步骤三:还有种情况是,循环移动需要处理,比如abcdef左移两位就会出现这种情况,当需要移动的元素回到最开始移动的元素的时候,说明出现了循环,判断结束条件,如果未结束,则将初始位置+1,继续步骤一、二、三。

	public  String leftRotate(char[] str,int l){
		if(str==null||str.length==0){
			return "";
		}
		while(l<0){//左移负数l位视作右移l位,同时处理为左移str.length+l位
			l += str.length;
		}
		while(l>str.length){
			l -= str.length;
		}
		int mvcount =0;
		char tmp = '0';
		for(int i=0;i

方法二:这个方法比较出名,自己暂时称作三反转:就是左边l个字符反转,剩下的字符反转,最后整体反转


第二个方法和第一种方法比较,

    缺点:每个字符会移动至少两次,而第一种方法仅一次就能找到目标位置,虽然时间复杂度都是O(n),但是第一种方法还是会快一些。

    优点:思路清晰,代码比较简单,基本不会出错,而第一种方法,可能需要多次测试才能保证不出错。

你可能感兴趣的:(Java)