两种方法从外至里顺时针打印二维矩阵的各个变量

两种方法的思路都是一致的,都是把一个二维矩阵看作一圈一圈的进行打印。

输入: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

第一种方式还不能成功运行,需要后续补充,也比第二种方法更麻烦一些。

第一种方式是想要控制边界变量以及增加或者减少从而使用两个循环解决问题:

代码如下:

public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> ret = new ArrayList<Integer>();
int iStartBorder = 0;
int iEndBorder = matrix.length - 1;
int jStartBorder = 0;
int jEndBorder = matrix[0].length - 1;
int i = 0;
int j = 0;
boolean iAddFlag = true;
boolean jAddFlag = true;
for (;i >= iStartBorder && i <= iEndBorder;) {
for (;j >= jStartBorder && j <= jEndBorder;) {
ret.add(matrix[i][j]);
if (jAddFlag) {
j++;
} else {
j--;
}
}
if (j == jEndBorder + 1) {
jEndBorder--;
i++;
if (i == iEndBorder) {
jAddFlag = false;
} else if (i == iStartBorder) {
jAddFlag = true;
}
} else if (j == jStartBorder - 1) {
j = jStartBorder;
i--;
if (i == iStartBorder) {
jStartBorder++;
jEndBorder--;
if (iStartBorder < iEndBorder || jStartBorder < jEndBorder) {
break;
}
}
}
}
return ret;
}

第二种方法:

import java.util.ArrayList;
import java.util.Iterator;

public class Matrix {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> ret = new ArrayList<Integer>();
int row = matrix.length;
int column = matrix[0].length;
int circle = ((row < column ? row:column) - 1)/2 + 1;
for (int i = 0;i < circle ;i++) {
for (int j = i; j < column - i; j++) {
ret.add(matrix[i][j]);
}
for (int j = i + 1; j < row - i; j++) {
ret.add(matrix[j][column - i - 1]);
}
/*
* 防止中间行多次打印(当行数小于列数并且是奇数时)
*/
if (row - i - 1 != i) {
for (int j = column - i - 2; j >= i; j--) {
ret.add(matrix[row - i - 1][j]);
}
}
/*
* 防止中间列多次打印(当列数小于行数并且是奇数)
*/
if (column - i - 1 != i) {
for (int j = row - i - 2; j > i; j--) {
ret.add(matrix[j][i]);
}
}
}
return ret;
}
public static void main(String [] args) {
int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}, {17,18,19,20}};
ArrayList<Integer> al = new Matrix().printMatrix(matrix);
for (Iterator<Integer> it = al.iterator(); it.hasNext();) {
System.out.println(it.next());
}
}
}

原文地址:https://www.cnblogs.com/adamhome/p/7505811.html