题解 | #顺时针打印矩阵#

顺时针打印矩阵

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(',');
//             }
            
            
//         }
        
    }
}

全部评论

相关推荐

拉丁是我干掉的:把上海理工大学改成北京理工大学。成功率增加200%
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务