java實(shí)現(xiàn)順時(shí)針打印矩陣
本文實(shí)例為大家分享了java實(shí)現(xiàn)順時(shí)針打印矩陣的具體代碼,供大家參考,具體內(nèi)容如下
題目:
輸入一個(gè)矩陣,按照從外向里以順時(shí)針的順序依次打印出每一個(gè)數(shù)字,例如,如果輸入如下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數(shù)字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
方法一:
介紹一種矩陣處理方式:矩陣分圈處理。在矩陣中用左上角的坐標(biāo)(tR,tC)和右下角的坐標(biāo)(dR,dC)可以表示一個(gè)子矩陣,如題目中矩陣,當(dāng)(tR,tC)=(0,0)、(dR,dC)=(3,3)時(shí),表示的子矩陣就是整個(gè)矩陣,那么這個(gè)子矩陣的最外層的部分為:
1 2 3 4
5 8
9 12
13 14 15 16
把這個(gè)子矩陣的最外層順時(shí)針打印出來,那么在(tR,tC)=(0,0)、(dR,dC)=(3,3)時(shí),打印的結(jié)果為: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)時(shí),此時(shí)的子矩陣為:
6 7
10 11
再把這個(gè)矩陣順時(shí)針打印出來,結(jié)果為6,7,11,10。再把tR和tC加1,dR和dC減1,即(tR,tC)=(2,2)、(dR,dC)=(1,1)。如果左上角坐標(biāo)位于右下角坐標(biāo)的右方或者下方(即tR>dR ||tC>dC),則停止,已經(jīng)打印的所有結(jié)果即為要求的打印結(jié)果。
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
*/
//轉(zhuǎn)圈打印矩陣
//左上角點(diǎn)(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),則每一圈開始的點(diǎn)是(0,0)、(1,1)...,可以觀察如果2*2矩陣,只打印1圈,3*3矩陣,打印2圈,3*2矩陣,打印1圈,所以有col>count*2 && row>count*2,count從0開始。
對于每一圈的打印,開始的行號和列號都為count,結(jié)束的行號endrow=row-1-count,結(jié)束的列號endcol=col-1-count。
第一步從左向右打印是必須的,循環(huán)打印,行號為count,列號為count到endrow遞增。
第二步從上往下打印滿足的條件是終止行號大于開始行號endrow>count,循環(huán)打印,行號為count+1到endrow遞增,列號為endcol。
第三步從右往左打印滿足的條件是第二步條件終止行號大于開始行號endrow>count并且終止列號大于開始列號endcol>count,循環(huán)打印,行號為endrow,列號為endcol-1到count遞減。
第四步從下往上打印滿足的條件是終止列號大于開始列號endcol>start且終止行號至少比開始行號大2即endrow-count>1,循環(huán)打印,行號為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;
//從左到右打印一行
//第一行一定會(huì)打印的
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]);
}
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java實(shí)現(xiàn)轉(zhuǎn)圈打印矩陣算法
- Java順時(shí)針打印矩陣
- java編程題之順時(shí)針打印矩陣
- Java編程實(shí)現(xiàn)打印螺旋矩陣實(shí)例代碼
- Java實(shí)現(xiàn)的打印螺旋矩陣算法示例
- java 二維數(shù)組矩陣乘法的實(shí)現(xiàn)方法
- Java實(shí)現(xiàn)的求逆矩陣算法示例
- Java實(shí)現(xiàn)輸出回環(huán)數(shù)(螺旋矩陣)的方法示例
- Java實(shí)現(xiàn)矩陣加減乘除及轉(zhuǎn)制等運(yùn)算功能示例
- Java實(shí)現(xiàn)的按照順時(shí)針或逆時(shí)針方向輸出一個(gè)數(shù)字矩陣功能示例
- java實(shí)現(xiàn)的順時(shí)針/逆時(shí)針打印矩陣操作示例
相關(guān)文章
IDEA啟動(dòng)tomcat控制臺(tái)中文亂碼問題的解決方法(100%有效)
很多人在idea中啟動(dòng)項(xiàng)目時(shí)會(huì)出現(xiàn)控制臺(tái)的中文亂碼,其實(shí)也無傷大雅,但是本人看著不舒服,下面這篇文章主要給大家介紹了關(guān)于IDEA啟動(dòng)tomcat控制臺(tái)中文亂碼問題的解決方法,需要的朋友可以參考下2022-09-09
使用maven運(yùn)行Java Main的三種方法解析
這篇文章主要介紹了使用maven運(yùn)行Java Main的三種方式的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
IDEA常用插件之類Jar包搜索Maven Search解讀
文章介紹了IDEA常用插件MavenSearch的使用方法,該插件可以幫助用戶快速查找和瀏覽Maven中央存儲(chǔ)庫中可用的依賴項(xiàng)和插件,方便用戶管理項(xiàng)目依賴項(xiàng)2025-01-01
spring mvc實(shí)現(xiàn)登錄賬號單瀏覽器登錄
這篇文章主要為大家詳細(xì)介紹了spring mvc實(shí)現(xiàn)登錄賬號單瀏覽器登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢操作
Nebula?Graph?是一款開源的、分布式的、易擴(kuò)展的原生圖數(shù)據(jù)庫,能夠承載包含數(shù)千億個(gè)點(diǎn)和數(shù)萬億條邊的超大規(guī)模數(shù)據(jù)集,并且提供毫秒級查詢,這篇文章主要介紹了Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢,需要的朋友可以參考下2022-10-10
Java設(shè)計(jì)模式之Adapter適配器模式
這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之Adapter適配器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03

