数组和矩阵

转圈打印矩阵
[题目]
给定一个整型矩阵matrix,请按照转圈的方式打印它
例如:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
打印结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
[要求]
额外空间复杂度为O(1)
[思路]
如果你按照下标的方式控制什么时候换行就比较麻烦了,下面我们介绍一种矩阵的处理方式,该方式也是处理矩阵的一种思路,代码实现起来也比较简便。
矩阵分圈处理:
1:在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵。
比如题目中的矩阵,当(tR,tC)=(0,0)和(dR,dC)=(3,3)表示的子矩阵是整个矩阵,这个矩阵的最外层为:
1 2 3 4
5 8
9 12
13 14 15 16
当(tR,tC)=(0,0)和(dR,dC)=(3,3)时候,打印的结果是1,2,3,4,8,12,16,15,14,13,9,5
2:接着我们改变tR,tC,dR,dC的值,让(tR,tC)=(1,1)和 (dR,dC)=(2,2)此时表示的子矩阵为:
6 7
10 11
在把这个矩阵打印出来:6,7,11,10
3:打印结束的条件是左上角的下标大于右下角的下标(左上角坐标跑到右下角坐标的右方或者下方)
[代码实现]

package 数组和矩阵;

public class Main1 {

    public static void main(String[] args) {
        int [][]matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        
        zhuanQuanPrint(matrix);
    }

    /**转圈打印*/
    private static void zhuanQuanPrint(int[][] matrix) {
        
        //定义左上角的坐标
        int tR = 0;
        int tC = 0;
        //定义右下角的坐标
        int dR=matrix.length-1;
        int dC=matrix[0].length-1;
        
        /**转圈打印*/
        while (tR<=dR || tC<=dC) {
            printEdage(matrix,tR++,tC++,dR--,dC--);
        }
        
    }

    /**转圈打印最外层*/
    private static void printEdage(int[][] matrix, int tR, int tC, int dR,
            int dC) {
        
        /**子矩阵只有一行*/
        if (tR == dR) {
            for (int i=tC;i<=dC;i++) {
                System.out.print(matrix[tR][i]+" ");
            }
        } else if(tC==dC){/**子矩阵只有一列*/
            for (int i=tR;i<=dR;i++) {
                System.out.print(matrix[i][tC]);
            }
        } else {//普通情况
            int curC = tC;
            int curR = tR;
            while (curC != dC) {
                System.out.print(matrix[tR][curC]+" ");
                curC++;
            }
            
            while (curR != dR) {
                System.out.print(matrix[curR][dC]+" ");
                curR++;
            }
            
            while (curC != tC) {
                System.out.print(matrix[dR][curC]+" ");
                curC--;
            }
            
            while (curR != tR) {
                System.out.print(matrix[curR][tC]+" ");
                curR--;
            }
            
        }
        
    }
    
}

2.将正方形矩阵顺时针转动90度
[题目]
给定一个NN的矩阵matrix,把这个矩阵调整成顺时针转动90度后的形式.
例如:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
顺时针转动90度后为:
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
[要求]
额外空间复杂度为O(1)
[思路]
分圈处理方式:在矩阵中左上角和右下角就可以表示一个子矩阵,当(tR,tC)=(0,0)和(dR,dC)=(3,3)表示的矩阵是
1 2 3 4
5 8
9 12
13 14 15 16
在这个矩阵中1,4,16,13为一组,然后1占据4的位置,4占据16的位置,16占据13的位置,13占据1的位置,一组就调整完,然后2,8,15,9为一组继续上述的调整,最后3,12,14,5为一组,当矩阵为4
4的时候分成了3租就调整结束,如果子矩阵的大小是M*M,一共就有M-1组,分别进行占据调整就可以了。

[代码实现]

package 数组和矩阵;

public class Main2 {

    public static void main(String[] args) {
        int [][]matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        
        rotatePrint(matrix);
        
        print(matrix);
    }

    private static void print(int[][] matrix) {
        for (int i=0;i<matrix.length;i++) {
            for (int j=0;j<matrix[0].length;j++) {
                System.out.print(matrix[i][j]+" ");
            }
            System.out.println();
        }
        
    }

    /**矩阵顺时针旋转*/
    private static void rotatePrint(int[][] matrix) {
        
        /**左上角坐标*/
        int tC=0;
        int tR=0;
        /**右下角坐标*/
        int dC=matrix.length-1;
        int dR = matrix[0].length-1;
        
        /**旋转打印*/
        while (tR < dR) {
            rotateEdge(matrix,tC++,tR++,dC--,dR--);
        }
        
    }

    /**顺时针旋转*/
    private static void rotateEdge(int[][] matrix, int tC, int tR, int dC, int dR) {
        
        int times = dC-tC;//总的次数
        int temp=0;
        for (int i=0;i!=times;i++) {/**一次循环就是一次调整*/
            temp = matrix[tR][tC+i];//第一次1的位置为空,13填进去
            matrix[tR][tC+i] = matrix[dR-i][tC];//13为空
            matrix[dR-i][tC] = matrix[dR][dC-i];//16填13位置
            matrix[dR][dC-i] = matrix[tR+i][dC];//16为空4填
            matrix[tR+i][dC] = temp;
            
        }
        
    }
    
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容

  • 2.5 多维数组和矩阵 1.数组(array)带多个下标的相同的元素的集合,常用的是数值型的数组如矩阵,也可以其他...
    Andrew_bao阅读 849评论 0 0
  • 当为array的时候,默认d*f就是对应元素的乘积,multiply也是对应元素的乘积,dot(d,f)会转化为矩...
    静默zzzz阅读 612评论 0 0
  • numpy.zeros() 创建零数组或者零矩阵 numpy.ones() 获得全一的数组或者矩阵 numpy.f...
    Waldo_cuit阅读 729评论 0 2
  • If tomorrow is the deadlineWe shall never finish the job ...
    citoyendumonde阅读 137评论 0 0
  • 曾经有一条随心的道路放在我面前,我没有去走,等我错过的时候我才后悔莫及,人世间最痛苦的事莫过于洗脑。 如果上天能够...
    锦程写书阅读 228评论 0 1