十九 剑指offer:顺时针打印矩阵(Java版)

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如 , 如果输入如下4 X 4矩阵:

[[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 static ArrayList firstPrintMatrix(int [][] matrix) {ArrayList list = new ArrayList<>();if(null == matrix || matrix.length < 1){return null;}print(matrix,list);return list;}public static ArrayList print(int [][] matrix,ArrayList list){//行 4int row = matrix.length;//列 1int col = matrix[0].length;if(row ==1 || col == 1){for (int i = 0 ; i < row; i){for (int j =0 ; j < col ;j){list.add(matrix[i][j]);}}}else {//第一行行不变,列变化for (int i = 0; i < col; i){list.add(matrix[0][i]);}//最后一列行变化 , 列不变for (int i =1; i < row; i){list.add(matrix[i][col-1]);}//最后一行,行不变,列变化for (int i = col-2; i > -1; i--){list.add(matrix[row-1][i]);}//第一列 , 行变化,列不变for (int i = row-2; i > 0; i--){list.add(matrix[i][0]);}}if (row - 2 > 0 && col - 2 > 0) {//构造新的二维数组int array[][] = new int[row - 2][col - 2];for (int i = 1; i <= row - 2; i) {for (int j = 1; j <= col - 2; j) {array[i - 1][j - 1] = matrix[i][j];}}print(array,list);}return list;}
第二种解法,和第一种类似,但是实现逻辑不一样,还是先遍历最外围的数据,然后往内收缩,重新创建一个四边形,代码如下
public static ArrayList secondPrintMatrix(int [][] matrix) {ArrayList list = new ArrayList<>();if(null == matrix || matrix.length < 1){return null;}int top = 0;//行int bottom = matrix.length;int left = 0;//列int right = matrix[0].length;while (top < bottom && left < right){//第一行行不变,列变化for (int i = left; i < right ;i){list.add(matrix[top][i]);}//最后一列行变化 , 列不变for (int i = top 1; i < bottom; i){list.add(matrix[i][right-1]);}//最后一行,行不变 , 列变化for(int i=right-2;i>=left&&bottom-1!=top;i--){list.add(matrix[bottom-1][i]);}for(int i=bottom-2;i>top&&right-1!=left;i--){list.add(matrix[i][left]);}top;bottom--;left;right--;}return list;}
完整代码如下
【十九 剑指offer:顺时针打印矩阵(Java版)】public class MainPrintMatrix {public static void main(String[] args) {//int [][]array ={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};int [][]array = {{1},{2},{3},{4}};//int [][]array = {{1,2},{3,4}};ArrayList integers = firstPrintMatrix(array);System.out.println("integers = "integers);}public static ArrayList firstPrintMatrix(int [][] matrix) {ArrayList list = new ArrayList<>();if(null == matrix || matrix.length < 1){return null;}print(matrix,list);return list;}public static ArrayList print(int [][] matrix,ArrayList list){//行 4int row = matrix.length;//列 1int col = matrix[0].length;if(row ==1 || col == 1){for (int i = 0 ; i < row; i){for (int j =0 ; j < col ;j){list.add(matrix[i][j]);}}}else {//第一行行不变 , 列变化for (int i = 0; i < col; i){list.add(matrix[0][i]);}//最后一列行变化,列不变for (int i =1; i < row; i){list.add(matrix[i][col-1]);}//最后一行,行不变 , 列变化for (int i = col-2; i > -1; i--){list.add(matrix[row-1][i]);}//第一列,行变化,列不变for (int i = row-2; i > 0; i--){list.add(matrix[i][0]);}}if (row - 2 > 0 && col - 2 > 0) {//构造新的二维数组int array[][] = new int[row - 2][col - 2];for (int i = 1; i <= row - 2; i) {for (int j = 1; j <= col - 2; j) {array[i - 1][j - 1] = matrix[i][j];}}print(array,list);}return list;}public static ArrayList secondPrintMatrix(int [][] matrix) {ArrayList list = new ArrayList<>();if(null == matrix || matrix.length < 1){return null;}int top = 0;//行int bottom = matrix.length;int left = 0;//列int right = matrix[0].length;while (top < bottom && left < right){//第一行行不变,列变化for (int i = left; i < right ;i){list.add(matrix[top][i]);}//最后一列行变化,列不变for (int i = top 1; i < bottom; i){list.add(matrix[i][right-1]);}//最后一行 , 行不变,列变化for(int i=right-2;i>=left&&bottom-1!=top;i--){list.add(matrix[bottom-1][i]);}for(int i=bottom-2;i>top&&right-1!=left;i--){list.add(matrix[i][left]);}top;bottom--;left;right--;}return list;}}

相关经验推荐