字符串循环左移问题

问题描述:给定一个长度为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&&mvcount<str.length-1;i++){
			tmp = str[i];
			int j=i;
			while(mvcount<str.length-1){
				mvcount++;
				str[j%str.length] = str[(j+l)%str.length];
				j = (j+l)%str.length;
				if((j+l)%str.length==i) break;
			}
			str[j] = tmp;
		}
		
		return String.copyValueOf(str);
	}

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


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

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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值