• 剑指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);
        }
    
    }
  • 相关阅读:
    zookeeper集群的部署
    【转】始于Jupyter Notebooks:一份全面的初学者实用指南
    【转】Jupyter Notebook主题字体设置及自动代码补全
    【转】pip install 快速下载
    【转】Sublime Text 3 常用快捷键
    【转】Python——DataFrame基础操作
    【转】sqlite3 小结
    【转】SQLite3的安装与使用
    Python Pandas pandas.DataFrame.to_sql函数方法的使用
    处理异常 ‘try’——‘except’ 方法
  • 原文地址:https://www.cnblogs.com/hupp/p/4593650.html
Copyright © 2020-2023  润新知