今天去參加了一個筆試,有一個筆試題是逐行輸出一個N*N螺旋矩陣,要求最小空間複雜度,好比4*4,則以下: java
1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
當時想了半天,最後終於想到個思路,不過也用了太長時間,沒時間寫具體代碼了。並且筆試也是手寫代碼到紙上,這樣代碼無法實時改和看結果,並且水平有限,因此很討厭這樣的寫代碼方式。 回來路上想既然思路都有了,在電腦上應該很快能寫出來,結果折騰了3個多小時才寫好,感受本身真是弱爆啊。。。對數字太不敏感,尤爲是for循環是0仍是1開頭,到底包不包括邊界,一複雜點兒就暈。。。 code
本身的思路是這樣的:每圈的長度是能夠算出來的,好比上面4*4的矩陣,最外圈長度是12,內圈的長度是4,因此可能夠根據第i*j個元素處在那一圈計算其值大小。 orm
最終代碼以下: get
public class Matrix { public static void main(String[] args) { new Matrix().printMatrix(7); } public static String form = null; public void printMatrix(int dim) { form = "%"+(String.valueOf(dim*dim).length()+1) + "d"; int max = (dim%2==0)?(dim/2):(dim/2+1); for(int i=1; i<=max; i++) { for(int j=1;j<i;j++) { print(getSize(j, dim)-(i-j)+1); } printTopLine(i, dim); for(int j=i-1;j>0;j--) { print(getSize(j-1, dim)+(dim-2*(j-1))+i-j); } System.out.println(); } for(int i=max+1; i<=dim; i++) { for(int j=1;j<=dim-i;j++) { print(getSize(j, dim)-(i-j)+1); } printBottemLine(dim-i+1, dim); for(int j=dim-i;j>0;j--) { print(getSize(j-1, dim)+(dim-2*(j-1))+i-j); } System.out.println(); } } public void print(int i) { System.out.format(form, i); } public int getSize(int level, int dim) { int size =0; for(int i=1;i<=level;i++) { size+=4*(dim-2*(i-1))-4; } return size; } public void printTopLine(int level, int dim) { int size =getSize(level-1, dim); for(int i=0; i<dim-2*(level-1);i++) { print(size+1+i); } } public void printBottemLine(int level, int dim) { int size =getSize(level, dim); int first = size+1; for(int i=0; i<dim-2*(level-1);i++) { print(first-(dim-2*(level-1))+1-i); } } }
輸出: for循環
1 2 3 4 5 6 7 24 25 26 27 28 29 8 23 40 41 42 43 30 9 22 39 48 49 44 31 10 21 38 47 46 45 32 11 20 37 36 35 34 33 12 19 18 17 16 15 14 13
但感受代碼仍是太複雜了,看着就暈,不知道誰有更簡單的方法啊,網上簡單搜了一些,沒找到。。。 form