我是靠谱客的博主 神勇羽毛,最近开发中收集的这篇文章主要介绍算法——之”字形打印矩阵,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

【题目】

给定一个矩阵matrix,按照“之”字形的方式打印这 个矩阵,

                 例如:1,2,3,4,5,6,7,8,9,10,11,12

                 “之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11, 8,12


【要求】 额外空间复杂度为O(1)。

 

思路:

使用宏观思想,千万不要把思路限制在局部。

①设计A,B指针一开始都在(0,0)位置

②A总是向右移动,B总是向下移动,当A运动到最右,往下移动,当B运动到最下,往右移动【A、B每次都走一步】,A和B每次都可以划出一个对角线。

       

最后A、B重合,我们只需要做的就是,通过A,B两个坐标,打印出对角线上的值,而之字型打印是有顺序的【左下到右上还是右上到左下】,我们只需要认为引入一个boolean量做区分即可。

 

具体代码实现:

/**
 * 之字形打印
 */
public class ZigZagPrint {
    public void printMatrixZigZag(int[][] matrix){
        int aR = 0;
        int aC = 0;
        int bR = 0;
        int bC = 0;
        int endR = matrix.length - 1;
        int endC = matrix[0].length - 1;
        boolean fromUp = false;
        while(aR != endR + 1){
            printLevel(matrix,aR,aC,bR,bC,fromUp);
            aR = aC == endC ? aR + 1: aR;
            aC = aC == endC ? aC : aC + 1;
            bC = bR == endR ? bC + 1 : bC;
            bR = bR == endR ? bR : bR + 1;
            fromUp = !fromUp;
        }
        System.out.println();
    }

    private void printLevel(int[][] matrix, int aR, int aC, int bR, int bC, boolean fromUp) {
        if (fromUp) {
            while (aC != bC - 1) {
                System.out.print(matrix[aR++][aC--] + " ");
            }
        } else {
            while (bC != aC + 1) {
                System.out.print(matrix[bR--][bC++] + " ");
            }
        }
    }

    @Test
    public void test(){
        int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        printMatrixZigZag(matrix);
    }
}

 

最后

以上就是神勇羽毛为你收集整理的算法——之”字形打印矩阵的全部内容,希望文章能够帮你解决算法——之”字形打印矩阵所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部