顺时针打印矩阵:重在理解,毕竟作者分析的那个方法看起来还是蛮复杂的-所以自己写了个接地气的方法
重在逻辑的一个题,一次性完全写对还是比较困难的
public class _Q20 {
public void PrintMatrixClockwisely(int matrix[][]){
if(matrix == null) return;
int start = 0;
int col = matrix[0].length;
if(col <= 0) return;
int row = matrix.length;
if(row <= 0) return;
while(col > (start<<1) && row > (start<<1)){
PrintMatrixInCircle(matrix, start, row, col);
++start;
}
System.out.println();
}
public void PrintMatrixInCircle(int matrix[][], int start, int row, int col){
boolean flags[] = {true, false, false, false}; // 保证先序关系
// step1:打印第一步
int indexX = start;
for(int j=start; j<=(col - start -1); j++){
flags[1] = true;
System.out.print(matrix[indexX][j] + " ");
}
// step2:打印第二步-前提是第一步成功打印
int indexY = col - start -1;
for(int i=(start+1); i<=(row - start -1); i++){
if(flags[1] == false) break;
flags[2] = true;
System.out.print(matrix[i][indexY] + " ");
}
// step3:打印第三步-前提是第二步成功打印
indexX = row - start -1;
for(int j=(col - start -2);j>=start; j--){
if(flags[2] == false) break;
flags[3] = true;
System.out.print(matrix[indexX][j] + " ");
}
// step4:打印第四步-前提是第三步成功打印
indexY = start;
for(int i=(row - start -2); i> start; i--){
if(flags[3] == false) break;
System.out.print(matrix[i][indexY] + " ");
}
}
}
测试代码:
public class _Q20Test extends TestCase {
_Q20 matrixPrinter = new _Q20();
public void test(){
int matrix1[][] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}};
int matrix2[][] = {
{1, 2, 3, 4},
{5, 6, 7, 8}};
int matrix3[][] = {{1}}; // 一行一列
int matrix4[][] = {{1, 2, 3, 4}}; // 一行
int matrix5[][] = {{1}, {2}, {3}, {4}}; // 一列
int matrix6[][] = null;
System.out.println("-------------------------matrix1");
matrixPrinter.PrintMatrixClockwisely(matrix1);
System.out.println("-------------------------matrix2");
matrixPrinter.PrintMatrixClockwisely(matrix2);
System.out.println("-------------------------matrix3");
matrixPrinter.PrintMatrixClockwisely(matrix3);
System.out.println("-------------------------matrix4");
matrixPrinter.PrintMatrixClockwisely(matrix4);
System.out.println("-------------------------matrix5");
matrixPrinter.PrintMatrixClockwisely(matrix5);
System.out.println("-------------------------matrix6");
matrixPrinter.PrintMatrixClockwisely(matrix6);
}