题目描述

  输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如,如果输入如下矩阵:
  

  则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。

牛客网刷题地址

思路分析

将矩阵看成若干个顺时针方向的圈组成.

  1. 第一步:接下来分析循环结束的条件。假设这个矩阵的行数是rows,列数是columns。打印第-圈的左上角的坐标是(0, 0),第二圈的左上角的坐标是(1, 1),以此类推。我们注意到,左上角的坐标中行标和列标总是相同的,于是可以在矩阵中选取左上角为(start, start)的一圈作 为我们分析的目标。对于一个5X5的矩阵而言,最后一-圈只有一个数字,对应的坐标为(2, 2)。我们发现5> 2x2。对于一个6X6的矩阵而言,最后一圈有4个数字,其左上角的坐标仍然为(2, 2)。 我们发现6>2*2依然成立。于是可以得出,让循环继续的条件是columns > startXx2并且rows > startY*2。
  2. 第二步:如何打印一圈的矩阵:
    我们可以分为四步:从左到右,从上到下,从右到左,从下到上,但是打印一圈时会出现如下特殊情况:所以说,这四步并不是都要执行

可以将其想象为一个原点在左上角的(X,Y)坐标轴,来进行分析。

测试用例

  1. 数组中有多行多列;数组中只有一行;数组中只有一列;数组中只一行一列。

Java代码

public class Offer29 {
public static void main(String[] args) {
test1();
test2();
test3();
} public static ArrayList<Integer> printMatrix(int[][] matrix) {
return Solution1(matrix);
} private static ArrayList<Integer> Solution1(int[][] matrix) {
if (matrix == null || matrix.length <= 0 || matrix[0].length <= 0) {
return null;
}
int start = 0;
int rows = matrix.length;
int columns = matrix[0].length; ArrayList<Integer> listSum = new ArrayList<Integer>(); while (columns > start * 2 && rows > start * 2) {
ArrayList<Integer> list = printMatrix(matrix, rows, columns, start);
listSum.addAll(list);
++start;
} return listSum;
} public static ArrayList<Integer> printMatrix(int[][] matrix, int rows, int columns, int start) {
int endX = columns - 1 - start;// 横坐标
int endY = rows - 1 - start;// 竖坐标
ArrayList<Integer> list = new ArrayList<Integer>();
// 左到右打印
for (int i = start; i <= endX; i++) {
int num = matrix[start][i];
System.out.println(num + ",");
list.add(num);
} // 从上到下打印
if (start < endY) {
for (int j = start + 1; j <= endY; j++) {
int num = matrix[j][endX];
System.out.println(num + ",");
list.add(num);
}
} // 从右到左打印
if (start < endX && start < endY) {
for (int i = endX - 1; i >= start; i--) {
int num = matrix[endY][i];
System.out.println(num);
list.add(num);
}
}
// 从下往上打印
if (start < endX && start + 1 < endY) {
for (int j = endY - 1; j >= start + 1; j--) {
int num = matrix[j][start];
System.out.print(num + ",");
list.add(num);
}
} return list; } private static void test1() {}
private static void test2() {}
private static void test3() {} }

代码链接

剑指Offer代码-Java

【Offer】[29] 【顺时针打印矩阵】的更多相关文章

  1. 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题

    剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...

  2. 剑指 Offer 29. 顺时针打印矩阵

    剑指 Offer 29. 顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: ...

  3. 力扣 - 剑指 Offer 29. 顺时针打印矩阵

    题目 剑指 Offer 29. 顺时针打印矩阵 思路1 其实就是按照理解题目的意思一步步从外层到内层打印出来,同时将一个外层分成四个部分分步打印 可以用一个变量count来维护当前打印的第几层 判断打 ...

  4. 【Java】 剑指offer(29) 顺时针打印矩阵

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 思 ...

  5. 剑指offer——29顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  6. [剑指offer] 29. 顺时针打印矩阵 (for循环条件)

    思路: 先定义左上和右下角点坐标,打印可分为从左到右,从上到下,从右到左,从下到上.依次判断最后一圈的四个循环条件. #include "../stdafx.h" #include ...

  7. 【剑指offer】面试题 29. 顺时针打印矩阵

    面试题 29. 顺时针打印矩阵 题目描述 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  8. 《剑指offer》顺时针打印矩阵

    本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...

  9. 【剑指Offer】顺时针打印矩阵 解题报告(Python)

    [剑指Offer]顺时针打印矩阵 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  10. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

随机推荐

  1. Linux基础文件查找

    一.文件查找 (一).命令文件 [root@linux ~]# chich ls //从PATH环境变量 [root@linux ~]# chereis vim [root@linux ~]# ech ...

  2. kubeproxy源码分析

    kubernetes离线安装包,仅需三步 kube-proxy源码解析 ipvs相对于iptables模式具备较高的性能与稳定性, 本文讲以此模式的源码解析为主,如果想去了解iptables模式的原理 ...

  3. SpringBoot配置web访问H2

    [**前情提要**]最近开始搭建博客,在本地调试的时候使用的数据库是h2,但是调试的时候需要查看数据库,本文也由此而来. --- 下面是我用到的方法: 1. 使用IDEA的Database连接工具,具 ...

  4. 使用webstorm搭建vue-cli项目

    前言 随着vue在前端不断的壮大,越来越多的前端工程师使用vue了,作为大型项目的开发,vue-cli是不二之选,所以这篇博客是为搭建vue-cli所写,想要搭建vue-cli项目就必须先有git,n ...

  5. 牛客多校训练第八场C.CDMA(思维+构造)

    题目传送门 题意: 输入整数m( m∈2k ∣ k=1,2,⋯,10),构造一个由1和-1组成的m×m矩阵,要求对于任意两个不同的行的内积为0. 题解: Code: #include<bits/ ...

  6. temperatureConversion1

    (原题:https://www.python123.io/student/courses/934/groups/8102/problems/programmings/6078) Solution: # ...

  7. 【译】为什么要了解HTTP

    原文地址:Why should I care about HTTP? 原作信息:by Devon Campbell. Dec 15 '18 Originally published at raddev ...

  8. RuntimeError: one of the variables needed for gradient computation has been modified by an inplace

    vgg里面的 ReLU默认的参数inplace=True 当我们调用vgg结构的时候注意 要将inplace改成 False 不然会报错 RuntimeError: one of the variab ...

  9. [ZJOI2011]看电影(组合数学,高精度)

    [ZJOI2011]看电影 这题模型转化很巧妙.(神仙题) 对于这种题首先肯定知道答案就是合法方案除以总方案. 总方案显然是\(k^n\). 那么考虑怎么算合法方案. 当\(n>k\)的时候显然 ...

  10. vue自定义组件中的v-model简单解释

    在使用iview框架的时候,经常会看到组件用v-model双向绑定数据,与传统步骤父组件通过props传值子组件,子组件发送$emit来修改值相比,这种方式避免操作子组件的同时再操作父组件,显得子组件 ...