题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
解题思路
我采用的是Java代码,其中主要思想是采用了一个和输入matrix一样大小的flagMatrix设置标识矩阵,当没被访问所有值为1,当访问完后值就为0,就可以知道matrix对应位置的值是否被访问,按顺时针方向进行数组的访问,将值add到list当中。编写代码时,有实例通过不了是没有考虑到矩阵的宽度和长度为1的情况,从而出现数组越界,所以代码中对应位置加了判断条件判断width是否为1和height是否为1。具体实现过程参阅代码。
题目链接.
代码块
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
int i=0,j=0;
int count=0;//用于计数访问量是否超过二维数组元素个数
int size=matrix.length*matrix[0].length;//二维数组元素个数
int height=matrix.length; //二维数组矩阵高度
int[][] flagMatrix=new int[height][width];
// System.out.println("size:"+size+" width:"+width+" height:"+height);
ArrayList<Integer> list=new ArrayList<Integer>();
for(i=0;i < height;i++){
for(j=0;j < width;j++){
flagMatrix[i][j]=1;
System.out.println(matrix[i][j]);
}
}
i=0;
j=0;
while(count<size){
while(flagMatrix[i][j]!=0){
// System.out.println(matrix[i][j]);
list.add(matrix[i][j]);
flagMatrix[i][j]=0;
j++;
count++;
if(j==width){
break;
}
}
if(height==1){//防止高度为1的矩阵的越界
break;
}
i++;
j--;
//System.out.println("j_:"+j);
while(flagMatrix[i][j]!=0){
// System.out.println(matrix[i][j]);
list.add(matrix[i][j]);
flagMatrix[i][j]=0;
i++;
count++;
if(i==height){
break;
}
}
if(width==1){//防止宽度为1的矩阵的越界
break;
}
i--;
j--;
while(flagMatrix[i][j]!=0){
// System.out.println(matrix[i][j]);
list.add(matrix[i][j]);
flagMatrix[i][j]=0;
j--;
count++;
if(j<0){
break;
}
}
i--;
j++;
while(flagMatrix[i][j]!=0){
// System.out.println(matrix[i][j]);
list.add(matrix[i][j]);
flagMatrix[i][j]=0;
i--;
count++;
if(i<0){
break;
}
}
i++;
j++;
}
return list;
}
}