顺时针打印矩阵

来源:互联网 发布:linux cp 两个文件 编辑:程序博客网 时间:2024/05/18 12:33

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

步骤:

由于题目是以从外圈到内圈的顺序依次打印,在矩阵中标注一圈作为分析的目标。设矩阵的列数为col,而其行数为row。一开始肯定要从左上角开始,即start=0开始,然后要求出右下角的坐标,选取左上角坐标为(startX, startY),右下角坐标为(endX, endY)的一个圈来分析。一圈一圈来分析。

 

     由于endX和endY可以根据startX、startY以及columns、rows来求得,因此此时我们只需要引入startX和startY两个变量。我们可以想象有一个循环,在每一次循环里我们从(startX, startY)出发按照顺时针打印数字。

      接着分析这个循环结束的条件。对一个5×5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2, 2)。我们发现5 > 2 * 2。对一个6×6的矩阵而言,最后一圈有四个数字,对应的坐标仍然为(2, 2)。我们发现6 > 2 * 2依然成立。于是我们可以得出,让循环继续的条件是“cols > startX * 2 && rows > startY * 2”。

      接下来我们分析如何按照顺时针的顺序打印一圈的数字。我们可以分四步来打印:第一步是从左到右打印一行,第二步是从上到下打印一列,第三步从右到左打印一行,最后一步是从下到上打印一列。也就是我们把打印一圈数字这个问题,分解成四个子问题。

      值得注意的是,最后一圈可能退化成只有一行、只有一列、甚至只有一个数字,因此打印这样的一圈就不需要四步了。

 

代码:(别人的代码)

  1. public class Solution_printjuzhen  
  2. {  
  3.     public ArrayList<Integer> printMatrix(int[][] matrix)  
  4.     {  
  5.         // 矩阵行数  
  6.         int rows = matrix.length;  
  7.         // 矩阵列数  
  8.         int columns = matrix[0].length;  
  9.   
  10.         ArrayList<Integer> list = new ArrayList<Integer>();  
  11.   
  12.         // 让循环继续的条件是当前行数大于该圈循环开始的行数的两倍以及当前列数大于该圈循环开始的列数的两倍(每圈循环开始的行数、列数相同)  
  13.         int start = 0;// 从(0,0)开始循环,圈数:start=0第一圈,start=1第二圈...以此类推  
  14.         while (rows > start * 2 && columns > start * 2)  
  15.         {  
  16.             // 每一圈最后一行下标  
  17.             int endRow = rows - 1 - start;  
  18.             // 每一圈最后一列下标  
  19.             int endColumn = columns - 1 - start;  
  20.             // 开始一圈圈打印,每打印一圈分为四步,从左到右、从上到下、从右到左、从下到上  
  21.             // 从左到右,第一步一定会走  
  22.             for (int i = start; i <= endColumn; i++)  
  23.                 list.add(matrix[start][i]);  
  24.             // 从上到下,最后一行大于开始行  
  25.             if (endRow > start)  
  26.             {  
  27.                 for (int i = start + 1; i <= endRow; i++)  
  28.                     list.add(matrix[i][endColumn]);  
  29.             } 
  1.   // 从右到左,最后一行大于开始行,最后一列大于开始列  
  2.             if (endRow > start && endColumn > start)  
  3.             {  
  4.                 for (int i = endColumn - 1; i >= start; i--)  
  5.                     list.add(matrix[endRow][i]);  
  6.             }  
  7.             // 从下到上,至少是三行两列,也就是最后一行大于开始行加2,最后一列大于开始列  
  8.             if (endRow >= start + 2 && endColumn > start)  
  9.             {  
  10.                 for (int i = endRow - 1; i > start; i--)  
  11.                     list.add(matrix[i][start]);  
  12.             }  
  13.             // 继续打印下一圈  
  14.             start++;  
  15.         }  
  16.         return list;  
  17.     }  
  18.   
  19.     public static void main(String[] args)  
  20.     {  
  21.         int[][] matrix =  
  22.         {  
  23.                 { 1234 },  
  24.                 { 5678 },  
  25.                 { 9101112 },  
  26.                 { 13141516 } };  
  27.         Solution_printjuzhen s = new Solution_printjuzhen();
  1.   ArrayList<Integer> printList = new ArrayList<Integer>();  
  2.         printList = s.printMatrix(matrix);  
  3.         for (int i = 0; i < printList.size(); i++)  
  4.         {  
  5.             System.out.print(printList.get(i) + "\0");  
  6.         }  
  7.     }  
  8.   

我的代码:

 public static ArrayList<Integer> printMatrix(int [][] matrix)
     {   
         ArrayList<Integer> list = new ArrayList<Integer>();
         if(matrix.length ==0)
             return list;
         int row=matrix.length;
         int col=matrix[0].length;
         int start=0;
         while(row>start*2&&col>start*2)
         {
             int endrow=row-1-start;
             int endcol=col-1-start;
             for(int i=start;i<=endcol;i++)
             {
                 list.add(matrix[start][i]);
             }
             if(endrow>start)
             {
                 for(int i=start+1;i<=endrow;i++)
                 {
                     list.add(matrix[i][endcol]);
                 }
             }
             if(endrow>start&&endcol>start)
             {
                 for(int i=endcol-1;i>=start;i--)
                 {
                     list.add(matrix[endrow][i]);
                 }
             }
             if(endrow>=start+2&&endcol>start)
             {
                 for(int i=endrow-1;i>start;i--)
                 {
                     list.add(matrix[i][start]);
                 }
             }
             start++;
         }
        
        return list;
      
        
      }


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝退款不退运费怎么办 拼多多不退运费怎么办 开发商不退团购服务费怎么办 支付宝话费充错了怎么办 电视版本低不支持投屏怎么办 绝地求生刺激战场不支持机型怎么办 手机不支持微信运动怎么办 淘宝虚拟商品买家退货退款怎么办 虚拟品申请啦退货退款怎么办 淘宝充值话费没到账怎么办 淘宝全球购买到假货怎么办 车跑路上没油了怎么办 摩托车跑路上没油了怎么办 话费充了不到帐怎么办 网上代充被骗了怎么办 天猫买东西没积分怎么办 购物时不要天猫积分怎么办 618没有天猫积分怎么办 话费充错了号码怎么办? 微信被骗充话费怎么办 微信话费充多了怎么办 睫毛烫的太卷了怎么办 烫完睫毛太卷了怎么办 烫睫毛太卷了怎么办 用微信充话费充错了怎么办 微信给空号充话费了怎么办 微信充话费充错号码是空号怎么办 淘宝充流量不到账怎么办 微信退货不退款怎么办 京东话费交错号怎么办? 微信缴费错了怎么办 给手机充话费被退款怎么办 买到假货淘宝商家已关店怎么办 手机刷错系统了怎么办 苹果手机成砖了怎么办 苹果6p变砖头怎么办 苹果刷成石头了怎么办 苹果手机更新成了砖头怎么办 京东售后好慢怎么办 京东商品超过售后期怎么办 京东过了售后期怎么办