"之"字形打印矩阵
2018-07-11 本文已影响0人
stoneyang94
题目描述
之字形打印一个矩阵
之字形例如:
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)
分析
思路
两个坐标进行记录,都从0,0点开始。一个往右移动,移动到最右往下移动;另一个往下移动,移动到最下往右移动,两个坐标始终处于一条斜线,然后打印斜线上的元素就行。
做法
宏观调度设置两个点A(aR,aC),B(bR,bC)(行,列),都从0,0点开始。
- 宏观
A向右走,当到最右点的时候(走过了endC = matrix[0].length-1
列),向下走
B向下走,当到最下点的时候(走过了endR = matrix.length-1
行),向右走 - 打印方向
设置一个布尔变量表示从上到下还是从下到上打印 - 结束
当aR到最后一行的时候 或者 当bC到最后一列的时候标志着打印结束
二维数组
二维数组其实是由一维数组组成,比如
int[][] arr = {
{1,2,3,4},
{4,5,6,8}
};
int rows = i.length;
//行数
int columns = i[0].length;
//列数
- length就是行数
- 列数是
具体到其中的一维里面
,再求length
代码实现
public class ZigZagPrintMatrix {
public static void zigZagPrintMatrix(int[][]matrix){
if(matrix==null || matrix.length==0 || matrix[0].length==0){
return ;
}
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 != matrix.length){//当aR到最后一行的时候
printMatrix(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;
}
}
public static void printMatrix(int[][]matrix,int aR,int aC,
int bR,int bC,boolean fromUp){
if(fromUp){//从右上到左下
while(aR!= bR+1){//一行一行扫过来
System.out.print(matrix[aR++][aC--]+" ");
}
}else {
while(bR != aR-1){
System.out.print(matrix[bR--][bC++]+" ");
}
}
}
public static void main(String[] args) {
int matrix[][] = new int[][]{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10,11, 12},
{13,14,15, 16}
};
zigZagPrintMatrix(matrix);
}
}
输出