Java逐行輸出N*N螺旋矩陣,要求最小空間複雜度

今天去參加了一個筆試,有一個筆試題是逐行輸出一個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

相關文章
相關標籤/搜索