今天下午看到一题关于二维数组顺时针打印,感觉第二部的方法书中解释的有点脱离带水的意思,所以自己实现了一下,基本思想如下:
其实题目就是安圈来一层一层的打印,所以每次圈的起点为二维数组对称轴上的数,并且由于每一圈的结束,二维数组的行和列的数是减二,所以结束条件就是:
行<=开始点行坐标*2,或者 列<=开始点的列坐标*2,而每一圈的打印部分,则是循环打印即可,代码如下:
package str;
import java.util.Vector;
public class PrintMatrixInCricle {
public static Vector<Integer> PrintCricle(int [][]a,int columns,int rows){
Vector<Integer> vector = new Vector<Integer>();
if (a.length==0||columns<=0||rows<=0)
return null;
int start = 0;
while (columns>start*2&&rows>start*2) {
GetCricle(a,columns,rows,start,vector);
start++;
}
return vector;
}
private static void GetCricle(int[][] a, int columns, int rows, int start,Vector<Integer> vector) {
// TODO Auto-generated method stub
int i =start;
int j =start;
while (i<rows-start-1) {
vector.add(a[start][i]);
i++;
}
while (j<columns-start-1) {
vector.add(a[j][i]);
j++;
}
while (i>start) {
vector.add(a[j][i]);
i--;
}
while (j>start) {
vector.add(a[j][i]);
j--;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int [][] a = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
Vector<Integer> vector =PrintCricle(a, a.length, a[0].length);
for (int i = 0; i < vector.size(); i++) {
System.out.print(vector.get(i)+"--");
}
}
}