zoukankan      html  css  js  c++  java
  • 剑指Offer:顺时针打印矩阵

    剑指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.

    题目分析

      这道题简直丧心病狂☺!我们采用的方式是一圈一圈打印

      答案将是从第一个外层按顺时针顺序排列的所有元素,然后是第二个外层的元素,依此类推

      我们首先定义四个元素,r1,r2,c1,c2,这将框定一个范围,我们顺时针打印这个范围边上的值,每次打印以后再次缩小框

      好的问题来了?

      1.要打印几个框?

        times=Math.min(长,宽)%2==0?Math.min(长,宽)/2:Math.min(长,宽)/2+1;

      2.顺时针打印的横纵坐标变化规律?如图所示有颜色是要打印的框

      

      3、吐槽一下这个题,简直恶心。

    Java题解

    class Solution {
        public List<Integer> spiralOrder(int[][] matrix) {
            List<Integer> ans = new ArrayList<>();
            int m = matrix.length; //行
            if (m == 0)
                return ans;
            int n = matrix[0].length;//列
            int c1  =  0;
            int c2  = n-1;
            int r1  = 0;
            int r2 = m-1;
            int times = Math.min(m,n)%2==0?Math.min(m,n)/2:Math.min(m,n)/2+1;
            for(int i=0;i<times;i++)
            {
                 for (int c = c1; c <= c2; c++) ans.add(matrix[r1][c]);
                for (int r = r1 + 1; r <= r2; r++) ans.add(matrix[r][c2]);
                if (r1 < r2 && c1 < c2) {
                    for (int c = c2 - 1; c > c1; c--) ans.add(matrix[r2][c]);
                    for (int r = r2; r > r1; r--) ans.add(matrix[r][c1]);
                }
                r1++;
                r2--;
                c1++;
                c2--;
            }
     
            return ans;
        }
    }
    

      

  • 相关阅读:
    解构赋值用在函数参数默认值中的一些情况
    obaa源码加注
    omi-mp-create源码加注
    小程序表情选择器
    小程序QQ版表情解析组件
    用TamperMonkey去掉cdsn中的广告
    小程序自定义tabbar
    Python基础入门——安装与运行
    LaTeX安装与入门
    Java 运行环境安装
  • 原文地址:https://www.cnblogs.com/MrSaver/p/12161024.html
Copyright © 2011-2022 走看看