剑指offer:顺时针打印矩阵

//输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
//例如,如果输入如下4 X 4矩阵: 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.

import java.util.ArrayList;
public class Solution {
	public static void main(String[] args)
	{
		int[][] matrix= {{1,2,3,4}};
		System.out.print(new Solution().printMatrix(matrix));
	}
	   public ArrayList<Integer> printMatrix(int [][] matrix) {
	       //实现思路  顺时针打印的过程类似于打印一圈的过程
		   //设计打印一圈的算法 设定所有圈都打印完成的条件 调用打印部分算法即可
		   
		   //非空判断
		   if(matrix==null)
		   {
			   return null;
		   }
		   //创建返回结果数组链表
		   ArrayList<Integer> result=new ArrayList<Integer>();
		   //记录最左侧在列中位置 最右侧在列中位置 最上边在行中位置 最下边。。。
		   int left=0;//最左侧位置下标
		   int right=matrix[0].length-1;//最右侧位置下标
		   int top=0;//最上侧
		   int bottom=matrix.length-1;//最底部
		   while((left<=right)&&(top<=bottom))
		   {
			   int index=0;
			   //遍历最上层 
			   for(index=left;index<=right;index++)
			   {
				   result.add(matrix[top][index]); 
			   }
			   top++;
			   //最右侧 横坐标增大 ,纵坐标不变
			   for(index=top;index<=bottom;index++)
			   {
				   result.add(matrix[index][right]);
			   }
			   right--;
			   //最下层 解决{{1,2,3,4,5}}的BUG
			   for(index=right;(top<=bottom)&&(index>=left);index--)
			   {
				   result.add(matrix[bottom][index]);
			   }
			   bottom--;
			   //一下两部分的判断条件中增加了循环中的部分条件
			   //因为循环的判断条件在每次查找完成一圈后 才进行判断
			   //而在查询过程中,就有可能出现已经访问过的元素再次访问的情况
			   //最左侧  解决{{1},{2},{3},{4},{5}}的BUG 如果left<=right 说明在遍历最上层时该部分元素已经访问
			   for(index=bottom;(left<=right)&&(index>=top);index--)
			   {
				   result.add(matrix[index][left]);
			   }
			   left++;
		   }
		   return result;
	    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值