java实现顺时针打印矩阵
作者:https://blog.csdn.net/qq_27139155/article/details/79451770 发布时间:2023-06-26 19:17:22
本文实例为大家分享了java实现顺时针打印矩阵的具体代码,供大家参考,具体内容如下
题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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
5 6 7 8
9 10 11 12
13 14 15 16
方法一:
介绍一种矩阵处理方式:矩阵分圈处理。在矩阵中用左上角的坐标(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,dR和dC减1,即(tR,tC)=(1,1)、(dR,dC)=(2,2)时,此时的子矩阵为:
6 7
10 11
再把这个矩阵顺时针打印出来,结果为6,7,11,10。再把tR和tC加1,dR和dC减1,即(tR,tC)=(2,2)、(dR,dC)=(1,1)。如果左上角坐标位于右下角坐标的右方或者下方(即tR>dR ||tC>dC),则停止,已经打印的所有结果即为要求的打印结果。
package Array;
import java.util.ArrayList;
import java.util.List;
public class spiralOrder {
/**
* @param matrix: a matrix of m x n elements
* @return: an integer list
*/
//转圈打印矩阵
//左上角点(tR,tC),右下角(dR,dC)
public List<Integer> spiralOrder(int[][] matrix) {
// write your code here
List<Integer> list=new ArrayList<>();
if(matrix==null||matrix.length==0) return list;
int dR=matrix.length-1;
int dC=matrix[0].length-1;
int tR=0;
int tC=0;
while(tR<=dR && tC<=dC ){
PrintMatrix(matrix,list,tR++,tC++,dR--,dC--);
}
return list;
}
private void PrintMatrix(int[][] matrix,List<Integer> list,int tR,int tC,int dR,int dC){
if(tR==dR){ // 子矩阵只有一行
for(int i=tC;i<=dC;i++)
list.add(matrix[tR][i]);
}else if(tC==dC){ // 子矩阵只有一列
for(int i=tR;i<=dR;i++)
list.add(matrix[i][tC]);
}else{
int curC=tC;
int curR=tR;
while(curC!=dC){
list.add(matrix[tR][curC]);
curC++;
}
while(curR!=dR){
list.add(matrix[curR][dC]);
curR++;
}
while (curC!=tC){
list.add(matrix[dR][curC]);
curC--;
}
while(curR!=tR){
list.add(matrix[curR][tC]);
curR--;
}
}
}
public static void main(String[] args) {
spiralOrder spiralOrder=new spiralOrder();
int[][] matrix={};
System.out.println(spiralOrder.spiralOrder(matrix));
}
}
方法二:
分析:如果以矩阵左上角为(0,0),则每一圈开始的点是(0,0)、(1,1)...,可以观察如果2*2矩阵,只打印1圈,3*3矩阵,打印2圈,3*2矩阵,打印1圈,所以有col>count*2 && row>count*2,count从0开始。
对于每一圈的打印,开始的行号和列号都为count,结束的行号endrow=row-1-count,结束的列号endcol=col-1-count。
第一步从左向右打印是必须的,循环打印,行号为count,列号为count到endrow递增。
第二步从上往下打印满足的条件是终止行号大于开始行号endrow>count,循环打印,行号为count+1到endrow递增,列号为endcol。
第三步从右往左打印满足的条件是第二步条件终止行号大于开始行号endrow>count并且终止列号大于开始列号endcol>count,循环打印,行号为endrow,列号为endcol-1到count递减。
第四步从下往上打印满足的条件是终止列号大于开始列号endcol>start且终止行号至少比开始行号大2即endrow-count>1,循环打印,行号为endrow-1到count+1递减,列号为count。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> result=new ArrayList<>();
public ArrayList<Integer> printMatrix(int [][] matrix) {
int row=matrix.length;
int col=matrix[0].length;
if(matrix==null || row<0 || col<0){
return null;
}
int count=0;
while(col>count*2 && row>count*2){
PrintCircle(matrix,col,row,count);
count++;
}
return result;
}
public void PrintCircle(int [][] matrix,int col,int row,int start){
int endrow=row-start-1;
int endcol=col-start-1;
//从左到右打印一行
//第一行一定会打印的
for(int i=start;i<=endcol;i++){
result.add(matrix[start][i]);
}
//从上往下打印(第二步)
if(endrow>start){
for(int i=start+1;i<=endrow;i++){
result.add(matrix[i][endcol]);
}
}
//从右往左打印(第三步)
if(endrow>start && endcol>start){
for(int i=endcol-1;i>=start;i--){
result.add(matrix[endrow][i]);
}
}
//从下往上打印(第四步)
if((endrow-start>1)&&endcol>start){
for(int i=endrow-1;i>=start+1;i--){
result.add(matrix[i][start]);
}
}
}
}
来源:https://blog.csdn.net/qq_27139155/article/details/79451770
猜你喜欢
- 前言1.因为涉及到对象锁,Wait、Notify一定要在synchronized里面进行使用。2.Wait必须暂定当前正在执行的线程,并释放
- 我们在j2ee当中,连接数据库的时候经常会用到properties配置文件,我们原来在eclipse或者myeclipse当中会在src文件
- Mybatis与JPA的优缺点JPA java持久层API可理解为一种规范,Hibernate就是其具体一个实现。它的实现应用是Spring
- 要想使Java运行,我们可以设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换为它可以识别的指令序列,也称为Java字节码
- 一、前置说明本节大纲使用lombok插件的好处如何安装lombok插件使用lombok提高开发效率二、使用lombok插件的好处我们在jav
- 1、为什么使用缓存  我们知道内存的读取速度远大于硬盘的读取速度。当需要重复地获取相同数据时,一次一次地
- 最近在做一个项目,遇到了项目打成 war 包的一个问题,项目创建时选择的时 jar 包方式,后因项目部署要求,需要打成 war 包部署,遇到
- 本文主要是用到java中的swing技术,以及JMFjar中的API,为大家分享了java音乐播放器的具体实现代码,供大家参考,具体内容如下
- MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoD
- 摘要:这个问题算是老生常谈了,我也是一段时间没弄过了,所以感觉有些忘了,就记录一下。一、后端通过shiro在session中存储数据://
- Executor接口基于以下方法可以完成增,删,改查以及事务处理等操作。事实上,mybatis中的所有数据库操作是通过调用这些方法实现的。p
- C++11 引入一个全新的线程库,包含启动和管理线程的工具,提供了同步(互斥、锁和原子变量)的方法,我将试图为你介绍这个全新的线
- 前言在我们平时使用图形化界面的时候,会发现来建立一个文件夹或者一个文档的时候很简单,只需要在桌面单击鼠标右键就可以了。但是,在我们写项目的时
- 1.super介绍我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。用于访问父类的属性,方法,构造器2.super
- 导入thymeleaf<dependency> <groupId>org.springframework
- 在之前项目中有用到关于获取手机联系人的部分,闲置就想和大家分享一下,话不多说,上代码:java部分:package com.example.
- 前端页面功能模块化拆分当一个系统的功能很多时,不可能所有功能模块的页面都写在一个页面里面,这时就需要将不同功能模块的页面拆分出去,就像模板一
- 动态方法就是一个Action对应多个请求,减少Action的数量1、指定method属性<action name="addA
- 这篇文章主要介绍了JAVA基于SnakeYAML实现解析与序列化YAML,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- Web UI项目中, 很多 Spring controller 视图函数直接返回 html 页面, 还有一些视图函数是要重定向或转发到其他的