• 顺时针打印矩阵 --剑指offer


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

    思路:

    一共打印(Math.min(m,n)-1)/2+1圈  外循环是这个 circle代表当前打印第几圈了 

    里边有四个循环 分别对应最上边的从左到右打印 最右边的从上往下...... 每个循环的开始和结束位置都是和circle有关 找一下规律

    特殊情况:第三个循环(下边的从右向左打印)  这里可能会出现一个问题 如果最后只剩一行的话 会不会和第一个循环重复打印 所以条件m-1-circle!=circle就是解决这个问题的

    m-1-circle就是当前打印的行 circle是第一个循环打印的行 只要他们两个不想等就可以打印 如果相等那就说明只有一行 那么不打印

    第四个循环同理。

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> printMatrix(int [][] matrix) {
           ArrayList<Integer> result=new ArrayList<>();
           int m=matrix.length;
           int n=matrix[0].length;
           int layers=(Math.min(m,n)-1)/2+1;
            for(int circle =0;circle < layers;circle++){
                for(int j=circle;j<n-circle;j++){
                    result.add(matrix[circle][j]);
                }
                for(int j=circle+1;j<m-circle;j++){
                    result.add(matrix[j][n-1-circle]);
                }
                for(int j=n-2-circle;j>=circle&&(m-1-circle!=circle);j--){ 
                    result.add(matrix[m-1-circle][j]);
                }
                for(int j=m-2-circle;j>=circle+1&&(n-1-circle)!=circle;j--){
                    result.add(matrix[j][circle]);
                }
            }
            return result;
        }
    }
  • 相关阅读:
    Linux CPU监控指标
    Elasticsearch强大的聚合功能Facet
    业务逻辑层的设计
    数据结构中的棧在C#中的实现
    使用WPF教你一步一步实现连连看
    ASP.NET之旅—再一次与ASP谋面
    每日一帖示例程序(使用TWebBrowser基于HTML做)
    在程序异常中记录堆栈信息(使用ExWatcher)
    获取TBitMap图像缓冲区,提高图像处理速度
    delphi实现穿XP防火墙
  • 原文地址:https://www.cnblogs.com/nlw-blog/p/12423488.html
Copyright © 2020-2023  润新知