1. 程式人生 > >字串或者陣列的迴圈左移或右移(不開闢額外的空間存放中間值)

字串或者陣列的迴圈左移或右移(不開闢額外的空間存放中間值)

對於的這樣的問題,我剛開始是有點蒙逼的,感覺不開闢額外的空間怎麼實現額。。。後來想起來以前老師有提過不用額外的空間交換兩個資料的演算法,頓時感覺有思路了。說白了陣列的左移就是一個交換的過程,既然能做到不用額外的空間交換資料,那陣列的左移也是可以實現的。

先說說不用額外的空間實現兩個資料的交換:

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;
	}
}