题解 | #顺时针打印矩阵#
顺时针打印矩阵
http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a
思路:顺时针遍历,那么优先级:右->下->左->上,判断一个格子能不能走(1.没出界;2.没走过)
注意,不是每走一格判断下一步要怎么走,一旦确定的方向就一直朝着这个方向走,直到不能走为止,再去进行下一个方向;
如果每走一格判断一次下一步怎么走,那么就会出现由于右的优先级大于上,当格子要往上走时,会因为优先级而先向右走,从而漏掉一些格子;
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> result = new ArrayList<>();
int[][] isWalk = new int[matrix.length][matrix[0].length];
//判断二维数组是否为空
if((matrix==null || matrix.length==0) || (matrix.length==1 && matrix[0].length==0)){
return result;
}
// 标记是否走过
for(int i=0; i<isWalk.length; i++){
for(int j=0; j<isWalk[0].length; j++){
if(i==0&&j==0){
isWalk[i][j] = 1; //起点直接初始化为1
}
else{
isWalk[i][j] = 0; //没走过置为0
}
}
}
// 起点
int i=0;
int j=0;
//总共要走多少个格子
int sumWalk = matrix.length * matrix[0].length;
int count = 1; //最开始已经占了1个格子
result.add(matrix[0][0]);
while(count < sumWalk){
//能不能向右走(只要满足向右走的条件就一直走,一旦确定了方向就一直走)
//先判断是否越界,如果越界就不用判断后面是不是走过这个格子了
//这样做可以防止数组越界(判断条件顺序不能颠倒)
while(j+1<matrix[0].length && isWalk[i][j+1] == 0){
// 向右走
i = i;
j = j + 1;
count = count + 1;
isWalk[i][j] = 1;
result.add(matrix[i][j]);
}
//能不能向下走
while(i+1<matrix.length && isWalk[i+1][j] == 0){
i = i + 1;
j = j;
count = count + 1;
isWalk[i][j] = 1;
result.add(matrix[i][j]);
}
//能不能向左走
while(j-1>=0 && isWalk[i][j-1] == 0){
i = i;
j = j - 1;
count = count + 1;
isWalk[i][j] = 1;
result.add(matrix[i][j]);
}
//能不能向上走
while(i-1>=0 && isWalk[i-1][j] == 0){
i = i - 1;
j = j;
count = count + 1;
isWalk[i][j] = 1;
result.add(matrix[i][j]);
}
}
return result;
// for(i=0; i<result.size(); i++){
// if(i == 0){
// System.out.print('[');
// }
// else if(i == result.size() - 1){
// System.out.print(result.get(i));
// System.out.print(']');
// }
// else{
// System.out.print(result.get(i));
// System.out.print(',');
// }
// }
}
}
查看5道真题和解析
海康威视公司氛围 1008人发布