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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

順時針打印矩陣

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

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

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

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

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

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

  • 經如上分析,得出以下實現:

/*** 順時針打印矩陣* @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 ++;}} ..... }
  • 接下來實現打印的邏輯。如上圖中分析,我們打印可以分為四個部分,:上,右,下,左。每一步我們都更具起始和終止的xy,坐標來循環,那么接下來我們只需要確認四個角的打印開始位置就行。

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

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

  • 如上分析,我們有如下實現:

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);}
  • 這種找規律的題目,本來就比較復雜,需要快速的找到規律并給出實現方案是關鍵,但問題比較抽象的時候,可以用圖形來解決。

上一篇:數據結構與算法–解決問題的方法- 二叉樹的的鏡像
下一篇:數據結構與算法–舉例分析法- 棧的壓入彈出序列

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。