字串或者陣列的迴圈左移或右移(不開闢額外的空間存放中間值)
阿新 • • 發佈:2019-01-30
對於的這樣的問題,我剛開始是有點蒙逼的,感覺不開闢額外的空間怎麼實現額。。。後來想起來以前老師有提過不用額外的空間交換兩個資料的演算法,頓時感覺有思路了。說白了陣列的左移就是一個交換的過程,既然能做到不用額外的空間交換資料,那陣列的左移也是可以實現的。
先說說不用額外的空間實現兩個資料的交換:
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; } }