一道笔试题,因为做的时候没有思路,所以通过网上查阅线下梳理了一遍,基本思路就是定行定列,逐渐向内缩圈,大致代码如下:
public static void main(String[] args) {
// 定义二维数组
int[][] a = new int[][] {
{1, 2, 3, 4, 5},
{14, 15, 16, 17, 6},
{13, 20, 19, 18, 7},
{12, 11, 10, 9, 8}
};
/*
* 标记左上角点的坐标
* luc 为 LeftUpCol简拼
*/
int lur = 0;
int luc = 0;
/*标记右下角点的坐标*/
int rdr = a[0].length - 1;
int rdc = a.length - 1;
//停止的条件是已经达到最小矩阵区域,即矩阵内部没有任何矩阵
while(lur <= luc && lur <= rdc) {
//首先遍历第一行,行不动,列动
int r = lur;
int c = luc;
while(c < rdc) {
System.out.print(a[r][c++] + " ");
}
//接着遍历右边的列,列不动,行动
c = rdc;
while(r < rdc) {
System.out.print(a[r++][c] + " ");
}
//遍历下边的一行,列不动,行动
r = rdr;
while(c >= luc) {
System.out.print(a[r][c--] + " ");
}
//会后遍历左边的一行,列不动,行动
c++;
r--;
while(r > luc) {
System.out.print(a[r--][c] + " ");
}
/*
* 每次遍历完后,向内部缩区域再次遍历
* 可以理解为,遍历完最外部一圈后,把内部的矩阵拿出来在重新遍历
* 依次重复直到到最里面的矩阵
*/
lur++;
luc++;
rdc--;
rdr--;
}
}
补充,按逆时针顺序输出
public static void main(String[] args) {
int[][] a = new int[][] {
{1, 12, 11, 10},
{2, 13, 16, 9},
{3, 14, 15, 8},
{4, 5, 6, 7}
};
int lur = 0;
int luc = 0;
int rdr = a[0].length - 1;
int rdc = a.length - 1;
while(lur <= luc && lur <= rdc) {
int r = lur;
int c = luc;
while(r < rdr) {
System.out.print(a[r++][c] + " ");
}
r--;
c++;
while(c < rdc) {
System.out.print(a[r][c++] + " ");
}
r = rdr;
while(r > lur) {
System.out.print(a[r--][c] + " ");
}
r = lur;
c = rdc;
while(c > luc) {
System.out.print(a[r][c--] + " ");
}
lur++;
luc++;
rdc--;
rdr--;
}
}