您的位置:首页 > Web前端

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

2016-07-12 20:13 363 查看
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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)从下到上

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

四个参数:left、right、top、buttom

 (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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指offer