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、封装的自定义集合工具类
- 近来复习数据结构,自己动手实现了栈。栈是一种限制插入和删除只能在一个位置上的表。最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表。首先
- Android在自定义控件时,经常需要获得屏幕的宽高,每次都要写,不妨直接把他封装成工具类,直接拿来用,废话不说,直接上代码/** * &n
- C#开发,收到下位机串口数据(温度信息),可能是正数也可能是负数,如何转换?第一反应是想起书本上的理论,无符号数表示范围是多少到多少,有符号
- ElGamal数字签名,供大家参考,具体内容如下一、实验目的学习ElGamal算法在数字签名方面的使用,掌握教科书版本的ElGamal数字签
- 异常处理机制1、抛出异常2、捕获异常3、异常处理五个关键字:try、catch、finally、throw、throws注意:假设要捕获多个
- 基于Java语言实现Socket通信由于近日项目需求,需要在服务器中增加Socket通信的功能,接收硬件设备发送的心跳包和相关数据,因此又重
- 前言今天给大家总结介绍一下Java类中this关键字和static关键字的用法。this关键字用法:this.属性可以调用类中的成员变量th
- 一、坐标分类地图坐标大致分为几种: 1、GPS、WGS84,也就是原始坐标体系,
- Mybatis配置返回为修改影响条数mybatis执行update()方法默认返回为匹配的更新记录条数,现在需要将update()方法修改为
- 一、内部类介绍1.定义:一个类内部又嵌套了一个类,被嵌套的类就是内部类(inner class),嵌套其他类的称为外部类(outer cla
- spring boot版本和spring cloud版本框架版本SpringBoot2.3.12.RELEASESpringCloudHox
- 前言研究表明,Java堆中对象占据最大比重的就是字符串对象,所以弄清楚字符串知识很重要,本文主要重点聊聊字符串常量池。Java中的字符串常量
- 首先,需要一个电话号码,目前很多账户都是将账户名设置成手机号,然后点击按钮获取手机验证码。 其次,你需要后台给你手机短信的验证接口,各个公司
- 作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短。今天就来总结一下Androi
- Java类成员变量的默认值基本数据类型作为类的成员变量时可以不赋予初值,在方法中输出也不会报错。下面我们看看我们的八种数据类型的默认值是什么
- 简介在多线程中解决线程安全的问题时常用到Synchronized,现在的synchronized相对于早期的synchronized做出了优
- 前言公司目前在做一款企业级智能客服系统,对于系统稳定性要求很高,不过难保用户在使用中不会出现问题,而 Android SDK 集成在客户的
- 自己写的一个日历记事本效果图 具体步骤:1.添加控件SkinEngine。 1.右键“工具箱”。“添加选项卡”,取名“皮肤”。
- Java-Web获取客户端真实IP:发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限