剑指offer-第四章解决面试题的思路(顺序打印矩阵)
题目:输入一个矩阵,按照从外向里的顺序依次打印出每一个数。(画图让抽象的问题形象化)
思路:打印矩阵时,把每一层当做一个圈来打印,找到打印整个矩阵的截止条件。
从上图中我可以看到一个6*6的矩阵(长宽分别为cloums,rows)最后一圈的最左边的顶点上面的坐标为(2,2),我们同时发现在一个5*5的矩阵中最后一圈的最左边的顶点的坐标也为(2,2),并且这个顶点的坐标的横坐标和纵坐标是相同的暂且设置为(start,start),因此我们可以得到截止条件即为,cloums>startX*2,rows>startY*2.并且我们同时发现打印没一圈的时候都是同样的操作,因此,我们可以使用递归来完成该操作。
打印每一圈的情况如下图所示:
C++代码:
#include<iostream> using namespace std; void printMatrixInCircle(int** numbers,int cloums,int rows,int start) { int endx=cloums-1-start; int endy=rows-1-start; //从左到右打印 for(int i=start;i<=endx;i++) { int number=numbers[start][i]; cout<<number<<" "; } //从上到下打印 if(start<endy) { for(int i=start+1;i<=endy;i++) { int number=numbers[i][endx]; cout<<number<<" "; } } //从右到左打印 if(start<endx&&start<endy) { for(int i=endx-1;i>=start;i--) { int number=numbers[endx][i]; cout<<number<<" "; } } //从下到上打印 if(start<endx&&start<endy-1) { for(int i=endy-1;i>=start+1;i--) { int number=numbers[i][start]; cout<<number<<" "; } } } void printMatrixClockWisely(int** numbers,int cloums,int rows) { if(numbers==NULL||cloums<=0||rows<=0) return; int start=0; while(cloums>start*2&&rows>start*2) { printMatrixInCircle(numbers,cloums,rows,start); start++; cout<<endl; } } void main() { int a[][3]={{1,2,3},{4,5,6},{7,8,9}}; int** b=new int*[3]; for(int i=0;i<3;i++) { b[i]=a[i]; } printMatrixClockWisely(b,3,3); }
Java代码:
public class PrintMatrix { public static void printMatrixInCircle(int[][] numbers,int cloums,int rows,int start) { int endx=cloums-1-start; int endy=rows-1-start; //从左到右打印 for(int i=start;i<=endx;i++) { int number=numbers[start][i]; System.out.print(number+" "); } //从上到下打印 if(start<endy) { for(int i=start+1;i<=endy;i++) { int number=numbers[i][endx]; System.out.print(number+" "); } } //从右到左打印 if(start<endx&&start<endy) { for(int i=endx-1;i>=start;i--) { int number=numbers[endx][i]; System.out.print(number+" "); } } //从下到上打印 if(start<endx&&start<endy-1) { for(int i=endy-1;i>=start+1;i--) { int number=numbers[i][start]; System.out.print(number+" "); } } } public static void printMatrixClockWisely(int[][] numbers,int cloums,int rows) { if(numbers==null||cloums<=0||rows<=0) return; int start=0; while(cloums>start*2&&rows>start*2) { printMatrixInCircle(numbers,cloums,rows,start); start++; System.out.println(); } } public static void main(String[] args) { int a[][]={{1,2,3},{4,5,6},{7,8,9}}; printMatrixClockWisely(a,3,3); } }