【Offer】[29] 【顺时针打印矩阵】
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如,如果输入如下矩阵:


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


将矩阵看成若干个顺时针方向的圈组成.
- 第一步:接下来分析循环结束的条件。假设这个矩阵的行数是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。 第二步:如何打印一圈的矩阵:
我们可以分为四步:从左到右,从上到下,从右到左,从下到上,但是打印一圈时会出现如下特殊情况:所以说,这四步并不是都要执行

可以将其想象为一个原点在左上角的(X,Y)坐标轴,来进行分析。
测试用例
- 数组中有多行多列;数组中只有一行;数组中只有一列;数组中只一行一列。
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】[29] 【顺时针打印矩阵】的更多相关文章
- 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题
剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...
- 剑指 Offer 29. 顺时针打印矩阵
剑指 Offer 29. 顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: ...
- 力扣 - 剑指 Offer 29. 顺时针打印矩阵
题目 剑指 Offer 29. 顺时针打印矩阵 思路1 其实就是按照理解题目的意思一步步从外层到内层打印出来,同时将一个外层分成四个部分分步打印 可以用一个变量count来维护当前打印的第几层 判断打 ...
- 【Java】 剑指offer(29) 顺时针打印矩阵
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 思 ...
- 剑指offer——29顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...
- [剑指offer] 29. 顺时针打印矩阵 (for循环条件)
思路: 先定义左上和右下角点坐标,打印可分为从左到右,从上到下,从右到左,从下到上.依次判断最后一圈的四个循环条件. #include "../stdafx.h" #include ...
- 【剑指offer】面试题 29. 顺时针打印矩阵
面试题 29. 顺时针打印矩阵 题目描述 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- 《剑指offer》顺时针打印矩阵
本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...
- 【剑指Offer】顺时针打印矩阵 解题报告(Python)
[剑指Offer]顺时针打印矩阵 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...
- 【剑指offer】顺时针打印矩阵
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...
随机推荐
- Linux基础文件查找
一.文件查找 (一).命令文件 [root@linux ~]# chich ls //从PATH环境变量 [root@linux ~]# chereis vim [root@linux ~]# ech ...
- kubeproxy源码分析
kubernetes离线安装包,仅需三步 kube-proxy源码解析 ipvs相对于iptables模式具备较高的性能与稳定性, 本文讲以此模式的源码解析为主,如果想去了解iptables模式的原理 ...
- SpringBoot配置web访问H2
[**前情提要**]最近开始搭建博客,在本地调试的时候使用的数据库是h2,但是调试的时候需要查看数据库,本文也由此而来. --- 下面是我用到的方法: 1. 使用IDEA的Database连接工具,具 ...
- 使用webstorm搭建vue-cli项目
前言 随着vue在前端不断的壮大,越来越多的前端工程师使用vue了,作为大型项目的开发,vue-cli是不二之选,所以这篇博客是为搭建vue-cli所写,想要搭建vue-cli项目就必须先有git,n ...
- 牛客多校训练第八场C.CDMA(思维+构造)
题目传送门 题意: 输入整数m( m∈2k ∣ k=1,2,⋯,10),构造一个由1和-1组成的m×m矩阵,要求对于任意两个不同的行的内积为0. 题解: Code: #include<bits/ ...
- temperatureConversion1
(原题:https://www.python123.io/student/courses/934/groups/8102/problems/programmings/6078) Solution: # ...
- 【译】为什么要了解HTTP
原文地址:Why should I care about HTTP? 原作信息:by Devon Campbell. Dec 15 '18 Originally published at raddev ...
- 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 ...
- [ZJOI2011]看电影(组合数学,高精度)
[ZJOI2011]看电影 这题模型转化很巧妙.(神仙题) 对于这种题首先肯定知道答案就是合法方案除以总方案. 总方案显然是\(k^n\). 那么考虑怎么算合法方案. 当\(n>k\)的时候显然 ...
- vue自定义组件中的v-model简单解释
在使用iview框架的时候,经常会看到组件用v-model双向绑定数据,与传统步骤父组件通过props传值子组件,子组件发送$emit来修改值相比,这种方式避免操作子组件的同时再操作父组件,显得子组件 ...