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í)針打印出來(lái),那么在(tR,tC)=(0,0)、(dR,dC)=(3,3)時(shí),打印的結(jié)果為:1,2,3,4,8,12,16,15,14,13,9,5。接下來(lái),分別使tR和tC加1,dR和dC減1,即(tR,tC)=(1,1)、(dR,dC)=(2,2)時(shí),此時(shí)的子矩陣為:
6 7
10 11
再把這個(gè)矩陣順時(shí)針打印出來(lái),結(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開始。
對(duì)于每一圈的打印,開始的行號(hào)和列號(hào)都為count,結(jié)束的行號(hào)endrow=row-1-count,結(jié)束的列號(hào)endcol=col-1-count。
第一步從左向右打印是必須的,循環(huán)打印,行號(hào)為count,列號(hào)為count到endrow遞增。
第二步從上往下打印滿足的條件是終止行號(hào)大于開始行號(hào)endrow>count,循環(huán)打印,行號(hào)為count+1到endrow遞增,列號(hào)為endcol。
第三步從右往左打印滿足的條件是第二步條件終止行號(hào)大于開始行號(hào)endrow>count并且終止列號(hào)大于開始列號(hào)endcol>count,循環(huán)打印,行號(hào)為endrow,列號(hào)為endcol-1到count遞減。
第四步從下往上打印滿足的條件是終止列號(hào)大于開始列號(hào)endcol>start且終止行號(hào)至少比開始行號(hào)大2即endrow-count>1,循環(huán)打印,行號(hào)為endrow-1到count+1遞減,列號(hào)為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]); } } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(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)文章
SpringBoot定時(shí)任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實(shí)現(xiàn)方法
本篇文章主要介紹了SpringBoot定時(shí)任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實(shí)現(xiàn)方法,詳細(xì)的介紹了Spring Schedule 與 Quartz 整合的兩種方法,有興趣的可以了解一下。2017-03-03解決Maven的pom.xml中設(shè)置repository不起作用問題
這篇文章主要介紹了解決Maven的pom.xml中設(shè)置repository不起作用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Spring boot 實(shí)現(xiàn)單個(gè)或批量文件上傳功能
這篇文章主要介紹了Spring boot 實(shí)現(xiàn)單個(gè)或批量文件上傳功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-08-08使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題
這篇文章主要介紹了使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08