顺时针打印矩阵(剑指offer面试题29)

2024-03-03 22:08

本文主要是介绍顺时针打印矩阵(剑指offer面试题29),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:

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


题目思路:

打印每一圈的时候需要四步:1)从左至右,2)从上到下,3)从右到左,4)从下到上。

打印最内一圈有三种情况:(1)只需要第一步,(2)需要前两步,(3)需要走三步。

所以走第二步(从上到下)条件就是起始行号小于终止行号

走第三步(从右到左)条件是 起始行号小于终止行号起始列号小于终止列号

走第四部(从下到上)条件是 终止行号至少比起始行号大2起始列号小于终止列号


代码:

class Solution {
public:vector<int> printMatrix(vector<vector<int> > matrix) {vector<int> res;if (matrix.size() == 0) return res;int row = matrix.size();int col = matrix[0].size();int start = 0;int row_ori = row, col_ori = col;while (2 * start < row_ori && 2 * start < col_ori){printCircle(res, matrix, row, col, start);start++;/*row--;col--;*/   //与下面注释代码同步注释(运行时也一同运行)}return res;}void printCircle(vector<int>& res, vector<vector<int>> matrix, int row, int col, int start){/*for (int i = start, j = start; j< col; j++){res.push_back(matrix[i][j]);}for (int i = start + 1, j = col - 1; i<row; i++){res.push_back(matrix[i][j]);}if(row -start!= 1){for (int i = row - 1, j = col - 2; j >= start; j--){res.push_back(matrix[i][j]);}}if(col- start!=1){for (int i = row - 2, j = start; i>start; i--){res.push_back(matrix[i][j]);}}*///More concise solutionint endX = row - 1 - start;int endY = col - 1 - start;// left to rightfor(int i = start, j = start;j <= endY;j++){res.push_back(matrix[i][j]);}// up to downif(start < endX){for(int i = start+1, j = endY; i<=endX; i++){res.push_back(matrix[i][j]);}}// right to leftif(start< endX && start <endY){for(int i = endX, j = endY-1; j>=start; j--){res.push_back(matrix[i][j]);}}// down to upif(endX - start > 1 && start < endY)for(int i = endX-1, j = start; i>start; i-- ){res.push_back(matrix[i][j]);}}};

这篇关于顺时针打印矩阵(剑指offer面试题29)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/771060

相关文章

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,