欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2019年03月03日 10:14:57   作者:https://blog.csdn.net/qq_27139155/article/details/79451770  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)順時(shí)針打印矩陣的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot定時(shí)任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實(shí)現(xià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
  • Springboot深入講解nocos的整合與使用

    Springboot深入講解nocos的整合與使用

    Nacos?是阿里巴巴推出來(lái)的一個(gè)新開源項(xiàng)目,這是一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái),在項(xiàng)目開發(fā)過(guò)程中,我們經(jīng)常使用nacos作為配置中心和注冊(cè)中心。本文章我們就從代碼層面研究下springboot是如何整合nacos使用的
    2022-07-07
  • SpringMVC中攔截器的實(shí)現(xiàn)

    SpringMVC中攔截器的實(shí)現(xiàn)

    SpringMVC 中的 Interceptor 攔截器是非常重要和相當(dāng)有用的,它的主要作用是攔截指定的用戶請(qǐng)求,并進(jìn)行相應(yīng)的預(yù)處理與后處理,這篇文章主要介紹了SpringMVC的攔截器相關(guān)知識(shí),需要的朋友可以參考下
    2022-01-01
  • 詳解 Java靜態(tài)代理

    詳解 Java靜態(tài)代理

    這篇文章主要介紹了 Java靜態(tài)代理的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java代理的知識(shí),感興趣的朋友可以了解下
    2020-08-08
  • Java_Spring之基于注解的 AOP 配置

    Java_Spring之基于注解的 AOP 配置

    這篇文章主要介紹了Java_Spring中基于注解的AOP配置,我們要先進(jìn)行環(huán)境的搭建,在進(jìn)行注解配置,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • 解決Maven的pom.xml中設(shè)置repository不起作用問題

    解決Maven的pom.xml中設(shè)置repository不起作用問題

    這篇文章主要介紹了解決Maven的pom.xml中設(shè)置repository不起作用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Spark集群框架的搭建與入門

    Spark集群框架的搭建與入門

    Spark是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的,基于內(nèi)存快速通用,可擴(kuò)展的集群計(jì)算引擎,實(shí)現(xiàn)了高效的DAG執(zhí)行引擎,可以通過(guò)基于內(nèi)存來(lái)高效處理數(shù)據(jù)流,運(yùn)算速度相比于MapReduce得到了顯著的提高。
    2021-06-06
  • Spring boot 實(shí)現(xiàn)單個(gè)或批量文件上傳功能

    Spring boot 實(shí)現(xiàn)單個(gè)或批量文件上傳功能

    這篇文章主要介紹了Spring boot 實(shí)現(xiàn)單個(gè)或批量文件上傳功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-08-08
  • Spring Bean常用的的裝配方式詳解

    Spring Bean常用的的裝配方式詳解

    這篇文章主要介紹了Spring Bean常用的的裝配方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題

    使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題

    這篇文章主要介紹了使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論