java實現(xiàn)順時針打印矩陣
本文實例為大家分享了java實現(xiàn)順時針打印矩陣的具體代碼,供大家參考,具體內(nèi)容如下
題目:
輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數(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
方法一:
介紹一種矩陣處理方式:矩陣分圈處理。在矩陣中用左上角的坐標(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)時,打印的結(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)時,此時的子矩陣為:
6 7
10 11
再把這個矩陣順時針打印出來,結(jié)果為6,7,11,10。再把tR和tC加1,dR和dC減1,即(tR,tC)=(2,2)、(dR,dC)=(1,1)。如果左上角坐標位于右下角坐標的右方或者下方(即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)圈打印矩陣
//左上角點(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,結(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;
//從左到右打印一行
//第一行一定會打印的
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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA啟動tomcat控制臺中文亂碼問題的解決方法(100%有效)
很多人在idea中啟動項目時會出現(xiàn)控制臺的中文亂碼,其實也無傷大雅,但是本人看著不舒服,下面這篇文章主要給大家介紹了關(guān)于IDEA啟動tomcat控制臺中文亂碼問題的解決方法,需要的朋友可以參考下2022-09-09
IDEA常用插件之類Jar包搜索Maven Search解讀
文章介紹了IDEA常用插件MavenSearch的使用方法,該插件可以幫助用戶快速查找和瀏覽Maven中央存儲庫中可用的依賴項和插件,方便用戶管理項目依賴項2025-01-01
Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢操作
Nebula?Graph?是一款開源的、分布式的、易擴展的原生圖數(shù)據(jù)庫,能夠承載包含數(shù)千億個點和數(shù)萬億條邊的超大規(guī)模數(shù)據(jù)集,并且提供毫秒級查詢,這篇文章主要介紹了Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢,需要的朋友可以參考下2022-10-10

