真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

java實現(xiàn)順時針打印矩陣

本文實例為大家分享了java實現(xiàn)順時針打印矩陣的具體代碼,供大家參考,具體內容如下

10年積累的成都做網站、網站制作、成都外貿網站建設經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先制作網站后付款的網站建設流程,更有霍邱免費網站建設讓你可以放心的選擇與我們合作。

題目:

輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數(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)時,打印的結果為: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 spiralOrder(int[][] matrix) {
 // write your code here
 List 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 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。

第一步從左向右打印是必須的,循環(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 result=new ArrayList<>();
 public ArrayList 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]);
   }
  }
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


名稱欄目:java實現(xiàn)順時針打印矩陣
本文來源:http://weahome.cn/article/gscccc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部