题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
代码:
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> result = new ArrayList<>();
// 结果的最大长度(二位数组长度)
int maxCount = matrix.length*matrix[0].length;
// 当前结果的长度,用来判断二维数组中的值是否已经全部在结果中
int count = 0;
// 当前已经放了 几行/几列 数据在结果中
// 即从上往下数放了row行,从下往上数放了row行,从左往右数放了col列,从右往左放了col列
int row=0,col=0;
// 循环放入
while (count < maxCount){
// 依次代表上、右、下、左的数组下标移位
int i,j,k,l;
// 先从左到右放入上面一行
for(i = col; i < matrix[0].length-col; i++) {
result.add(matrix[row][i]);
count++;
}
// 放完即判断是否已经全部放入,下同
if(count >= maxCount)
break;
// 再从上到下放人右边的一列
for(j = row+1; j < matrix.length-row; j++){
result.add(matrix[j][i-1]);
count++;
}
if(count >= maxCount)
break;
// 再从右到左放入下面的一行
for(k = matrix[0].length-1-col-1; k >= col; k--){
result.add(matrix[j-1][k]);
count++;
}
if(count >= maxCount)
break;
// 再从下到上放人左边的一列
for(l = matrix.length-1-row-1; l >= row+1; l--){
result.add(matrix[l][k+1]);
count++;
}
if(count >= maxCount)
break;
// 如果成功放完一圈,行数和列数各加一
row++;
col++;
}
return result;
}
呕心沥血写出来的,转载请一定注明出处!