矩阵的“之”字形打印
2017-12-05 00:00
190 查看
题目:给定一个矩阵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)
Solution:
按照如下方式打印即可:
先输出(0,0)的值,然后设定两个方向。一个从(0,0)开始向右,遇到边界就向下;另一个从(0,0)向下,遇到边界就向右。两者同时进行。然后设定一个bool变量flag, true表示从右上往坐下输出,false表示左下往右上输出(也可以相反)。
具体代码如下:
例子:
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)
Solution:
按照如下方式打印即可:
先输出(0,0)的值,然后设定两个方向。一个从(0,0)开始向右,遇到边界就向下;另一个从(0,0)向下,遇到边界就向右。两者同时进行。然后设定一个bool变量flag, true表示从右上往坐下输出,false表示左下往右上输出(也可以相反)。
具体代码如下:
public class Main { public static final int N = 5; public static final int MAX = 10; public static void main(String[] args) { int[][] m = new int[(int)(Math.random() * N + 1)][(int)(Math.random() * N + 1)];//矩阵大小随机 for (int i = 0; i < m.length; i++) { //矩阵中元素的值随机 for (int j = 0; j < m[i].length; j++) { m[i][j] = (int)(Math.random() * MAX); } } println(m); printZ(m); } public static void printZ(int[][] m) { //矩阵“之”字形打印 System.out.print(m[0][0]); int i = 0, j = 0; int x1 = 0, y1 = 0, x2 = 0, y2 = 0; boolean flag = false; while(!(x1 == x2 && x1 == m.length - 1)) { if (i++ < m[0].length - 1) { y1 = i; } else { y1 = m[0].length - 1; x1++; } if (j++ < m.length - 1) { x2 = j; } else { y2++; x2 = m.length - 1; } flag = flag ? false : true; help(m, x1, y1, x2, y2, flag); } } public static void help(int[][]m, int x1, int y1, int x2, int y2, boolean flag) { if (flag) { for (int i = x1; i <= x2; i++) { System.out.print(" " + m[i][y1--]); } } else { for (int i = x2; i >= x1; i--) { System.out.print(" " + m[i][y2++]); } } } public static void println(int[][] m) { //输出矩阵的元素 for (int i = 0; i < m.length; i++) { System.out.print(m[i][0]); for (int j = 1; j < m[i].length; j++) { System.out.print(" " + m[i][j]); } System.out.println(); } System.out.println(); } }
相关文章推荐