zoukankan      html  css  js  c++  java
  • c++刷题(43/100)矩阵旋转打印

    题目1:矩阵旋转打印

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

    思路:打印的时候一圈一圈的打印,记录两个对角(0,0),(m,n),这样逻辑会比较清晰

    class Solution {
    public:
        void print(vector<vector<int> > matrix,int tx,int ty,int bx,int by,vector<int> &ans){
            if(tx>bx||ty>by) return ;
            if(bx==tx){
                for(int i=ty;i<=by;i++){
                    ans.push_back(matrix[tx][i]) ;
                }
            }else if(by==ty){
                for(int i=tx;i<=bx;i++){
                    ans.push_back(matrix[i][ty]) ;
                }
            }else{
                for(int i=ty;i<by;i++){
                    ans.push_back(matrix[tx][i]) ;
                }
                for(int i=tx;i<bx;i++){
                    ans.push_back(matrix[i][by]) ;
                }
                for(int i=by;i>ty;i--){
                    ans.push_back(matrix[bx][i]) ;
                }
                for(int i=bx;i>tx;i--){
                    ans.push_back(matrix[i][ty]) ;
                }
            }
        }
        vector<int> printMatrix(vector<vector<int> > matrix) {
            int m = matrix.size() ;
            int n = matrix[0].size() ;
            int t = m<n? m : n ;
            vector<int> ans ;
            for(int i=0;i<t;i++){
                print(matrix,0+i,0+i,m-1-i,n-1-i,ans) ;
            }
            return ans ;
        }
    };

    题目2:机器人的运动范围

    地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

    思路:反正我一看就想到了搜索,由于之前做了推箱子,感觉很快就写出来了,搜索关键就是对于能否继续搜索下去的条件判断,这道题除了越界和它的那个阈值判断就没了

    class Solution {
    public:
        struct Pos{
            int x , y ;
            Pos(int x,int y){
                this->x = x ;
                this->y = y ;
            }
        };
        int movingCount(int threshold, int rows, int cols)
        {
            queue<Pos> q ;
            int ans = 0 ;
            vector<vector<int>> vis(rows,vector<int>(cols)) ;
            int a[] = {0,0,-1,1} ;
            int b[] = {-1,1,0,0} ;
            Pos p(0,0) ;
            q.push(p) ;
    
            while(!q.empty()){
                Pos t = q.front() ;
                q.pop() ;
                if(t.x>=rows||t.y>=cols||t.x<0||t.y<0) continue ;
                if(vis[t.x][t.y]) continue ;
                string sumStr = to_string(t.x)+to_string(t.y) ;
                int sum = 0 ;
                for(int i=0;i<sumStr.length();i++){
                    sum += sumStr[i]-'0' ;
                }
                if(sum>threshold) continue ;
                vis[t.x][t.y] = 1 ;
                ans++ ;
                for(int i=0;i<4;i++){
                    Pos next(t.x+a[i],t.y+b[i]) ;
                    q.push(next) ;
                }
            }
            return ans ;
        }
    };

    题目三:两个链表的第一个公共节点

    输入两个链表,找出它们的第一个公共结点。

    思路:按照长度差,让长度长的先走,然后对比每个节点,如果都没有就返回NULL,然而网上的解答比较厉害,mark一下

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };*/
    class Solution {
    public:
        ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
            ListNode *p1 = pHead1;
            ListNode *p2 = pHead2;
            while(p1!=p2){
                p1 = (p1==NULL ? pHead2 : p1->next);
                p2 = (p2==NULL ? pHead1 : p2->next);
            }
            return p1;
        }
    };
  • 相关阅读:
    word 操作技巧
    有朝一日
    菜狗日记2021.7.10
    记一次JSON.toJSONString()踩坑
    菜狗日记2020.11.13
    菜狗日记2020.11.6
    菜狗日记2020.11.03
    菜狗日记2020.10.29
    菜狗日记2020.10.17
    菜狗日记2020.10.11
  • 原文地址:https://www.cnblogs.com/maskmtj/p/9437314.html
Copyright © 2011-2022 走看看