日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法--解决问题的方法-顺时针打印矩阵

發(fā)布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法--解决问题的方法-顺时针打印矩阵 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

順時針打印矩陣

  • 題目輸入一個矩陣,按照從外向里順時針的順序依次打印每一個數(shù)字。例如下案例:

  • 如上圖矩陣,順時針打印:1,2,3,4,8,12,16,15,14,13,9,5,6,7,1,10

  • 以上問題看起來比較復(fù)雜,但是又沒有涉及到復(fù)雜的數(shù)據(jù)結(jié)構(gòu),因為我們矩陣的實現(xiàn)需要用到二維數(shù)組,必然涉及到邊界值的判斷,不限行的話,非常容易數(shù)組越界,然后按循環(huán)打印又涉及到循環(huán)的嵌套。因此我們先用圖分析整個打印過程

  • 當(dāng)問題復(fù)雜的時候我們可以用圖片拆解問題,將復(fù)雜問題拆成局部小問題分析,如下,我們用一個循環(huán)來打印矩陣,每次分析其中的一個圈。

  • 如上第一圈的遍歷,我們假設(shè)行數(shù)是row,列是col。打印的時候最左上角的坐標(biāo)應(yīng)該都是行列都是相同的,例如(0,0),(1,1),(2,2)等。因此我們開始的起點標(biāo)識為start,那么坐標(biāo)就是(start,start)

  • 上圖中是一個44 的矩陣,最后一圈明顯有4個數(shù)字起始坐標(biāo) (1,1),4> 11,但是對于一個55 的矩陣來說,最后一圈就只有一個坐標(biāo)(2,2),5> 22,對于66 的矩陣最后一圈還是4個,起始坐標(biāo)還是(2,2),6> 22。我們可以得出,每次的起點位置都是滿足 col > startX 2 并且 row > startY2。可以將這個當(dāng)做循環(huán)結(jié)束的條件

  • 經(jīng)如上分析,得出以下實現(xiàn):

/*** 順時針打印矩陣* @author liaojiamin* @Date:Created in 11:11 2021/4/2*/ public class PrintMatrix {public static void printMartix(int[][] nums, int col, int row){if(nums == null || row <= 0 || col <= 0){return;}int start = 0;while(col > start*2 && row > start*2){printMartix(nums, col, row, start);start ++;}} ..... }
  • 接下來實現(xiàn)打印的邏輯。如上圖中分析,我們打印可以分為四個部分,:上,右,下,左。每一步我們都更具起始和終止的xy,坐標(biāo)來循環(huán),那么接下來我們只需要確認(rèn)四個角的打印開始位置就行。

  • 不過應(yīng)該注意的是,最后一圈不一定是一個圈,或者一個點,可能是一個直線,因為我們以上的案例都是四方的矩陣,還有長方的,例如5*6 的矩陣

  • 如上特殊案例中,我們每次打印之前需要判斷,我們的起始坐標(biāo)(start, start)應(yīng)該比(endx,endy)都要小

  • 如上分析,我們有如下實現(xiàn):

public static void printMartix(int[][] nums, int col, int row, int start){int endx = col-start-1;int endy = row-start-1;for (int i = start; i <= endx; i++) {System.out.print(nums[start][i]);System.out.print(",");}if(start < endy){for(int i = start+1; i<=endy; i++){System.out.print(nums[i][endx]);System.out.print(",");}}if(start < endx && start< endy){for(int i = endx-1;i >=start; i--){System.out.print(nums[endy][i]);System.out.print(",");}}if(start < endx){for(int i = endy - 1; i>=start+1;i--){System.out.print(nums[i][start]);System.out.print(",");}}}public static void main(String[] args) {int row = 10, col = 8;int[][] nums = new int[row][col];for (int i = 0; i < row; i++) {for (int i1 = 0; i1 < col; i1++) {nums[i][i1] = i*i1;System.out.print(i*i1);System.out.print(",");}System.out.println();}System.out.println();printMartix(nums, col, row);}
  • 這種找規(guī)律的題目,本來就比較復(fù)雜,需要快速的找到規(guī)律并給出實現(xiàn)方案是關(guān)鍵,但問題比較抽象的時候,可以用圖形來解決。

上一篇:數(shù)據(jù)結(jié)構(gòu)與算法–解決問題的方法- 二叉樹的的鏡像
下一篇:數(shù)據(jù)結(jié)構(gòu)與算法–舉例分析法- 棧的壓入彈出序列

總結(jié)

以上是生活随笔為你收集整理的数据结构与算法--解决问题的方法-顺时针打印矩阵的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。