• [剑指offer]顺时针打印矩阵


    调了两三小时,从通过11%的案例,到60%,再到80%,再到100%

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

      

    我的思路就是把矩阵看成一圈一圈的,而顺时针打印就是从最外圈到最里圈一圈一圈遍历

    同时一个圈由四个变量决定:行开始的地方,行结束的地方,列开始的地方和列结束的地方

    所以只需控制好这四个变量,注意边界,问题就不难了

    同时,需要考虑的特殊情况就是一行的矩阵和一列的矩阵,还有最里圈的只有一行,和只有一个数字的情况

    这些都考虑到问题就解决了

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> printMatrix(int [][] matrix) {
            int rowEnd = matrix.length-1;//行
            int columnEnd = matrix[0].length-1;//列
            int columnStart = 0;
            int rowStart = 0;
            ArrayList<Integer> res = new ArrayList<>();
            //特殊情况,只有一行
            if (matrix.length==1){
                for (int i = 0;i < matrix[0].length;i++){
                    res.add(matrix[0][i]);
                }
                return res;
            }
            //特殊情况,只有一列
            if (matrix[0].length==1){
                for (int i = 0;i < matrix.length;i++){
                    res.add(matrix[i][0]);
                }
                return res;
            }
            //把矩形看做一圈一圈的,一圈一圈打印,控制好边界
            while (true){
                if (columnEnd<columnStart||rowStart>rowEnd){
                    break;
                }
                res.addAll(printIn(matrix,rowStart,rowEnd,columnStart,columnEnd));
                rowStart+=1;
                columnStart+=1;
                rowEnd-=1;
                columnEnd-=1;
            }
            return res;
        }
        //全部常量均为下标,即从0开始
        public ArrayList<Integer> printIn(int[][] matrix,int rowStart,int rowEnd,int columnStart,int columnEnd){
            ArrayList<Integer> list = new ArrayList<>();
            int i = 0;
            if (columnEnd==columnStart){
                //列开始和列结束重合,即最里圈只剩一个数
                list.add(matrix[rowEnd][columnEnd]);
                return list;
            }
            if (rowEnd==rowStart){
                //行开始和行结束重合,最里圈只有一行,将此行加入list
                for (i = columnStart;i <= columnEnd;i++){
                    list.add(matrix[rowStart][i]);
                }
                return list;
            }
            //四个for循环遍历一圈
            for (i = columnStart;i <= columnEnd;i++){
                list.add(matrix[rowStart][i]);
            }
            for (i = rowStart+1;i < rowEnd;i++){
                list.add(matrix[i][columnEnd]);
            }
            for (i = columnEnd;i>=columnStart;i--){
                list.add(matrix[rowEnd][i]);
            }
            for (i = rowEnd-1;i>=rowStart+1;i--){
                list.add(matrix[i][rowStart]);
            }
            return list;
        }
    }
    

      

  • 相关阅读:
    线程
    VS调试Tip集结
    努力提高代码的质量
    深入Razor,你准备好了吗?(兼谈我的学习方法和定位)
    使用匿名委托,Lambda简化多线程代码
    敏捷个人-自我成长[关注个人成长软技能]
    使用ActiveRecord的三层构架及泛型例子
    RUP4+1架构方法
    信息系统字段动态定义 和 JavaScript 实用脚本,很好,珍藏起来[转贴]
    CRM2011
  • 原文地址:https://www.cnblogs.com/Yintianhao/p/10050869.html
Copyright © 2020-2023  润新知