当前位置: 首页 > java >正文

书籍转圈打印矩阵(8)0604

题目
给定一个整型矩阵matrix,请按照转圈的方式打印它。

例如:

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

额外空间复杂度为O(1)

解答

这道题可以使用矩阵分圈处理法,这个方法适用与所有矩阵处理。

在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵,比如,题目中的矩阵,当(tR,tC)=(0,0)、(dR,dC)=(3,3),表示的子矩阵就是整个矩阵,那么这个子矩阵最外层的部分如下:

1        2        3        4

5                            8

9                           12 

13     14      15      16

如果能把这个子矩阵的外层转圈打印出来,那么在(tR,tC)=(0,0)、(dR,dC)=(3,3)时,打印的结果为:1,2,3,4,8,12,16,15,14,13,9,5。接下来令tR和tC加1,即(tR,tC)=(1,1),令dR和dC减1,(dR,dC)=(2,2),此时表示的子矩阵如下:

6        7

10     11

再把这个子矩阵转圈打印出来,结果为:6,7,11,10。把tR和tC加1,即(tR,tC)=(2,2),令dR和dC减1,即(dR,dC)=(1,1)。如果发现左上角坐标跑到了右下角坐标的右方或下方,整个过程就停止。已经打印的所有结果来连起来就是我们要求的打印结果。

public void spiralOrderPrint(int[][] matrix){int tR = 0;int tC = 0;int dR = matrix.length - 1 ;int dC = matrix[0].length - 1;while(tR < dR && tC <= dC ){printEdge(matrix,tR++,tC++,dR--,dC--);}
}public void printEdge(int[][] m,int tR,int tC,int dR,int dC){if(tR == dR){//子矩阵只有一行时for(int i = tC;i<=dC;i++){System.out.print(m[tR][i]+ " " );}}else if(tC == dC){//子矩阵只有一列时for(int i = tR; i<= dR;i++){System.out.print(m[i][tC] + " ");}}else{//一般情况int curC = tC;int curR = tR;while(curC != dC){System.out.print(m[tR][curC] + " ");curC++;}while(curR != dR){System.out.print(m[curR][dC] + " ");curR++;}while(curC != tC){System.out.print(m[dR][curC] + " ");curC--;}while(curR != tR){System.out.print(m[curR][tC] + " ");curR--;}}
}

http://www.xdnf.cn/news/11967.html

相关文章:

  • Reids 如何处理缓存穿透、缓存击穿、缓存雪崩问题?
  • 使用ArcPy进行栅格数据分析
  • 麒麟+ARM架构安装mysql8的操作指南
  • 各个布局的区别以及示例
  • Sql Server 中常用语句
  • 计算机系统结构-第五章-目录式协议
  • psycopg2-binary、pgvector、 SQLAlchemy、 PostgreSQL四者的关系
  • 【无人机】无人机UAV、穿越机FPV的概念介绍,机型与工具,证书与规定
  • JavaScript性能优化实战:深入探讨JavaScript性能瓶颈与优化技巧
  • UE5 创建了一个C++类,现在我还有一个蓝图类,我想将编写的C++类中包含的功能加入到这个蓝图类里面,如何做到
  • 2025年渗透测试面试题总结-腾讯[实习]安全研究员(题目+回答)
  • P3156 【深基15.例1】询问学号
  • Windows系统工具:WinToolsPlus 之 SQL Server 日志清理
  • Centos 8系统ext4文件系统类型进行扩容缩容 (LVM)
  • FFMPEG 提取视频中指定起始时间及结束时间的视频,给出ffmpeg 命令
  • C#学习第27天:时间和日期的处理
  • 开发源码搭建一码双端应用分发平台教程:逐步分析注意事项
  • H5移动端性能优化策略(渲染优化+弱网优化+WebView优化)
  • 从传统 RAG 到知识图谱 + Agent
  • 信创认证通关攻略:从环境搭建到测试报告的全流程操作指南
  • Day39 训练
  • 安卓开发:Reason: java.net.SocketTimeoutException: Connect timed out
  • Windows蓝屏查找、查看日志文件处理方法
  • setting up Activiti BPMN Workflow Engine with Spring Boot
  • FAST(Features from Accelerated Segment Test)角检测算法原理详解和C++代码实现
  • CanvasGroup篇
  • python学习打卡day44
  • 测试开发笔试题 Python 字符串中提取数字
  • Linux操作系统shell脚本
  • 并行智算MaaS云平台:打造你的专属AI助手,开启智能生活新纪元