中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java實現順時針打印矩陣

發布時間:2020-09-24 06:39:08 來源:腳本之家 閱讀:156 作者:https://blog.csdn.ne 欄目:編程語言

本文實例為大家分享了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]);
   }
  }
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

抚州市| 昌都县| 比如县| 东宁县| 厦门市| 江达县| 石狮市| 昌吉市| 丰县| 邢台县| 罗山县| 五寨县| 大关县| 新民市| 胶州市| 辰溪县| 延长县| 绥德县| 安西县| 西充县| 兴仁县| 蒲江县| 兴宁市| 三亚市| 泸溪县| 石首市| 大丰市| 新绛县| 龙州县| 青冈县| 白朗县| 卢氏县| 阿拉尔市| 富顺县| 通河县| 科技| 平顶山市| 白山市| 公安县| 台东市| 丰台区|