mio4 Java Web & Web Security

顺时针打印矩阵

2018-08-27
mio4

阅读:


顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

分析

  • 这道题和前面做的 Z字形打印矩阵 CCF题一样,都是对于二维矩阵的自定义打印
  • 把矩阵的四面看做是四个围墙(North、East、South、West),围墙不断缩进,直到打印完所有的数字
  • 打印方向用flag表示,flag = 1表示从左往右,2表示从上往下,3表示从右往左,4表示从下往上
  • 然后Debug之后写出了下面的程序,虽然AC了,但是很繁琐
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       		ArrayList<Integer> result = new ArrayList<Integer>();
		int NORTH = 0;
		int EAST = 0;
		int SOUTH = 0;
		int WEST = 0;
		int flag = 1;
		int cnt = 0;
		int n = matrix.length; //行数
		int m = matrix[0].length; //列数
		int i = 0;
		int j = 0;
		while(cnt < m*n){
			if(flag == 1){
				for(int k=WEST; k < m-EAST; k++) {
					result.add(matrix[i][j]);
					j++;
					cnt++;
				}
				j--;
				i++;
				NORTH++;
				flag = 2;
			} else if(flag == 2){
				for(int k=NORTH; k < n-SOUTH; k++){
					result.add(matrix[i][j]);
					i++;
					cnt++;
				}
				i--;
				j--;
				EAST++;
				flag = 3;
			} else if(flag == 3){
				for(int k=m-EAST-1; k >= WEST ;k--){
					result.add(matrix[i][j]);
					j--;
					cnt++;
				}
				j++;
				i--;
				SOUTH++;
				flag = 4;
			} else if(flag == 4){
				for(int k=n-SOUTH-1; k >= NORTH; k--){
					result.add(matrix[i][j]);
					i--;
					cnt++;
				}
				i++;
				j++;
				WEST++;
				flag = 1;
			}
		}
		return result;
    }
}
  • 现在考虑程序的优化
    • 发现循环变量k的存在意义不大,将其由i和j表示
		ArrayList<Integer> result = new ArrayList<Integer>();
		int NORTH = 0;
		int EAST = 0;
		int SOUTH = 0;
		int WEST = 0;
		int flag = 1;
		int cnt = 0;
		int n = matrix.length; //行数
		int m = matrix[0].length; //列数
		int i = 0;
		int j = 0;
		while(cnt < m*n){
			if(flag == 1){
				for(j=WEST; j < m-EAST; j++) {
					result.add(matrix[i][j]);
					cnt++;
				}
				j--;
				i++;
				NORTH++;
				flag = 2;
			} else if(flag == 2){
				for(i=NORTH; i < n-SOUTH; i++){
					result.add(matrix[i][j]);
					cnt++;
				}
				i--;
				j--;
				EAST++;
				flag = 3;
			} else if(flag == 3){
				for(j=m-EAST-1; j >= WEST ;j--){
					result.add(matrix[i][j]);
					cnt++;
				}
				j++;
				i--;
				SOUTH++;
				flag = 4;
			} else if(flag == 4){
				for(i=n-SOUTH-1; i >= NORTH; i--){
					result.add(matrix[i][j]);
					cnt++;
				}
				i++;
				j++;
				WEST++;
				flag = 1;
			}
		}
		return result;
  • 看了一下《剑指Offer》上的解法,书上的解法和上面AC的差不多
  • 但是书中对于最后一圈打印时分出了三种情况
    • 我是使用count变量计数到m*n就结束打印

Comments

Content