字符串或者数组的循环左移或右移(不开辟额外的空间存放中间值)

对于的这样的问题,我刚开始是有点蒙逼的,感觉不开辟额外的空间怎么实现额。。。后来想起来以前老师有提过不用额外的空间交换两个数据的算法,顿时感觉有思路了。说白了数组的左移就是一个交换的过程,既然能做到不用额外的空间交换数据,那数组的左移也是可以实现的。

先说说不用额外的空间实现两个数据的交换:

int a=10;
int b=15;
a = a + b;
b = a - b;
a = a - b;

 
整体的代码如下:

public class LeftRotateString {
	public static void main(String[] args) {
		System.out.println(change("abcdefgh".toCharArray(),3));
	}

	public static char[] change(char[] c,int k){
		for(int i=0;i<k/2;i++){
			/*c[i]^=c[j]^=c[i]^=c[j];*/
			int j = k-i-1;
			c[i]=(char) (c[i]+c[j]);
			c[j]=(char) (c[i]-c[j]);
			c[i]=(char) (c[i]-c[j]);
			
		}
		for(int n=0;n<(c.length-k)/2;n++){
			int j=c.length-1-n;
			int i=k+n;
			c[i]=(char) (c[i]+c[j]);
			c[j]=(char) (c[i]-c[j]);
			c[i]=(char) (c[i]-c[j]);
		}
		for(int i=0;i<c.length/2;i++){
			int j=c.length-1-i;
			c[i]=(char) (c[i]+c[j]);
			c[j]=(char) (c[i]-c[j]);
			c[i]=(char) (c[i]-c[j]);
		}
		return c;
	}
}

点赞