最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • Java synchronized的鎖升級(jí)過(guò)程詳解

    Java synchronized的鎖升級(jí)過(guò)程詳解

    在 JDK 1.6之前,synchronized 是一個(gè)重量級(jí)、效率比較低下的鎖,但是在JDK 1.6后,JVM 為了提高鎖的獲取與釋放效,,對(duì) synchronized 進(jìn)行了優(yōu)化,所以本文給大家介紹了synchronized的鎖升級(jí)過(guò)程,需要的朋友可以參考下
    2024-04-04
  • IDEA啟動(dòng)tomcat控制臺(tái)中文亂碼問(wèn)題的解決方法(100%有效)

    IDEA啟動(dòng)tomcat控制臺(tái)中文亂碼問(wèn)題的解決方法(100%有效)

    很多人在idea中啟動(dòng)項(xiàng)目時(shí)會(huì)出現(xiàn)控制臺(tái)的中文亂碼,其實(shí)也無(wú)傷大雅,但是本人看著不舒服,下面這篇文章主要給大家介紹了關(guān)于IDEA啟動(dòng)tomcat控制臺(tái)中文亂碼問(wèn)題的解決方法,需要的朋友可以參考下
    2022-09-09
  • Java lock同步鎖使用實(shí)例解析

    Java lock同步鎖使用實(shí)例解析

    這篇文章主要介紹了Java lock同步鎖使用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 使用maven運(yùn)行Java Main的三種方法解析

    使用maven運(yùn)行Java Main的三種方法解析

    這篇文章主要介紹了使用maven運(yùn)行Java Main的三種方式的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • IDEA常用插件之類Jar包搜索Maven Search解讀

    IDEA常用插件之類Jar包搜索Maven Search解讀

    文章介紹了IDEA常用插件MavenSearch的使用方法,該插件可以幫助用戶快速查找和瀏覽Maven中央存儲(chǔ)庫(kù)中可用的依賴項(xiàng)和插件,方便用戶管理項(xiàng)目依賴項(xiàng)
    2025-01-01
  • spring mvc實(shí)現(xiàn)登錄賬號(hào)單瀏覽器登錄

    spring mvc實(shí)現(xiàn)登錄賬號(hào)單瀏覽器登錄

    這篇文章主要為大家詳細(xì)介紹了spring mvc實(shí)現(xiàn)登錄賬號(hào)單瀏覽器登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • eclipse 安裝lombok插件

    eclipse 安裝lombok插件

    這篇文章主要介紹了eclipse 安裝lombok插件的詳細(xì)步驟,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢操作

    Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢操作

    Nebula?Graph?是一款開源的、分布式的、易擴(kuò)展的原生圖數(shù)據(jù)庫(kù),能夠承載包含數(shù)千億個(gè)點(diǎn)和數(shù)萬(wàn)億條邊的超大規(guī)模數(shù)據(jù)集,并且提供毫秒級(jí)查詢,這篇文章主要介紹了Nebula?Graph介紹和SpringBoot環(huán)境連接和查詢,需要的朋友可以參考下
    2022-10-10
  • Java設(shè)計(jì)模式之Adapter適配器模式

    Java設(shè)計(jì)模式之Adapter適配器模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之Adapter適配器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Nacos源碼閱讀方法

    Nacos源碼閱讀方法

    這篇文章將會(huì)帶大家閱讀Nacos源碼以及教大家閱讀源碼的技巧,感興趣的朋友跟隨小編一起看看Nacos源碼閱讀方法
    2022-03-03

最新評(píng)論

丹寨县| 石嘴山市| 湛江市| 桃源县| 冀州市| 宁阳县| 永仁县| 乐陵市| 隆尧县| 永和县| 柳林县| 遂昌县| 东阿县| 桦甸市| 东乡县| 建阳市| 双鸭山市| 新宁县| 华容县| 仁布县| 武威市| 永福县| 白玉县| 垫江县| 甘孜县| 庄浪县| 合阳县| 江永县| 定远县| 玉环县| 武清区| 武功县| 宁津县| 黑河市| 平安县| 乌什县| 郑州市| 武陟县| 长兴县| 北川| 梧州市|