剑指offer----顺时针打印数组----java实现

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

思路:顺时针打印时,分为四个步骤:

(1)从左到右  

(2)从上到下

(3)从右到左

(4)从下到上

问题的复杂性在于如果打印中矩阵只剩下一个数字、只有一行、只有一列的情况下,该如何控制。

四个参数:leftrighttopbuttom

 (1)从左到右,第一步是需要的,判断left是否小于等于right

 (2)从上到下,终止行要大于起始行,即buttom>top

 (3)从右到左,至少要有两行两列才会有第三步,也就是right>left&&buttom>top

 (4)从下到上,至少要有三行两列才会执行第四步;即right >left&&buttom-1>top.

 public ArrayList<Integer> printMatrix(int [][] matrix) 
	    {
	       ArrayList list = new ArrayList();
	       int rows = matrix.length;
	       int colums = matrix[0].length;
	       if(matrix == null||rows==0||colums==0)
	    	   return list;
	       int left = 0; int right = rows-1;
	       int top = 0;  int buttom = colums -1;  
	       while(left<=right && top<= buttom)
	       {
	    	   //第一步从左到右
	    	   for (int i = left; i <= right; ++i)
			  {
			  	list.add(matrix[top][i]);//列在变化,行是最上面一行
			  }
	    	   //第二步从上到下 buttom>top
	    	   if(buttom > top)
	    	   {
	    		   for (int i = top + 1; i <= buttom; ++i)
				{
					list.add(matrix[i][right]);//行在变化,列是最右列
				}
	    	   }
	    	   //第三步从右到左 right>left&&buttom>top
	    	   if(right > left && buttom > top)
	    	   {
	    		   for (int i = right -1; i >= left; --i)
				{
					list.add(matrix[buttom][i]); //列在变化,最低行
				}
	    	   }
	    	   //第四步从下到上
	    	   if(buttom - 1 > top && right > left)
	    	   {
	    		   for (int i = buttom -1; i > top; --i)
				{
	    			   list.add(matrix[i][left]);
				}
	    	   }
	    	   left++;right--;
	    	   top++;buttom--;
	       }
	       return list;
	    	   
	    }


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值