当前位置: 首页 > news >正文

#每日一题合集#牛客JZ23-JZ33

为了督促自己每天练一练编程
时间:2022年8月21日-2022年8月31日
网站:https://www.nowcoder.com/exam/oj/ta?tpId=13

文章目录

    • 8.21-JZ23. 链表中环的入口结点
    • 8.22-JZ24. 反转链表
    • 8.23-JZ25. 合并两个排序的链表
    • 8.24-JZ26. 树的子结构
    • 8.25-JZ27. 二叉树的镜像
    • 8.26-JZ28.对称的二叉树
    • 8.27-JZ29. 顺时针打印矩阵
    • 8.28-JZ30. 包含min函数的栈
    • 8.29-JZ31. 栈的压入、弹出序列
    • 8.30-JZ32.从上往下打印二叉树
    • 8.31-JZ33. 二叉搜索树的后序遍历序列

8.21-JZ23. 链表中环的入口结点

在这里插入图片描述
这个题,找环很容易,快慢指针是否相遇即可;主要是找环的入口结点,这个解释可以参考官方题解:
在这里插入图片描述

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* is_cycle(ListNode* head){
        if(head == NULL)
            return NULL;
        ListNode* slow = head;
        ListNode* fast = head;
        
        while(fast != NULL && fast->next != NULL){
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow)
                return slow;
        }
        return NULL;
    }
    
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        ListNode* slow = is_cycle(pHead);
        if(slow == NULL)
            return NULL;
        ListNode* fast = pHead;
        while(fast != slow){
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }
};

8.22-JZ24. 反转链表

在这里插入图片描述
很简单的链表内部反转,用个tmp指针记录一下下一个即可

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        ListNode* cur = pHead;
        ListNode* pre = NULL;
        ListNode* tmp = pHead;
        while(cur != NULL){
            tmp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = tmp;
        }
        return pre;
    }
};

8.23-JZ25. 合并两个排序的链表

在这里插入图片描述

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        if(pHead1 == NULL)
            return pHead2;
        if(pHead2 == NULL)
            return pHead1;
        ListNode* res = new ListNode(0);
        ListNode* cur = res;
        
        while(pHead1 != NULL && pHead2 != NULL){
            if(pHead1->val < pHead2->val){
                cur->next = pHead1;
                pHead1 = pHead1->next;
            }
            else{
                cur->next = pHead2;
                pHead2 = pHead2->next;
            }
            cur = cur->next;
        }
        if(pHead1 != NULL)
            cur->next = pHead1;
        if(pHead2 != NULL)
            cur->next = pHead2;
        return res->next;
    }
};

8.24-JZ26. 树的子结构

在这里插入图片描述
        因为空树不是任何树的子树,所以要先判断B树是否为空树。
        当A树为空,但是B树还有节点的时候,不为子树;但是B树到空节点时可以是子树。
        双重遍历:A遍历自己所有的节点当做子树的起点,每次再递归比较是否与B树完全一致

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    bool Judge(TreeNode* root1, TreeNode* root2) {
        if(root1 == NULL && root2 != NULL)
            return false;
        if(root1 == NULL || root2 == NULL)
            return true;
        if(root1->val != root2->val)
            return false;
        return Judge(root1->left, root2->left) && Judge(root1->right, root2->right);
    }
    
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if(pRoot2 == NULL)
           return false;
        if(pRoot1 == NULL && pRoot2 != NULL)
            return false;
        if(pRoot1 == NULL || pRoot2 == NULL)
            return true;
        bool flag1 = Judge(pRoot1, pRoot2);
        bool flag2 = HasSubtree(pRoot1->left, pRoot2);
        bool flag3 = HasSubtree(pRoot1->right, pRoot2);  
        return flag1 || flag2 || flag3;
    }
};

8.25-JZ27. 二叉树的镜像

在这里插入图片描述
在这里插入图片描述
非常简单的递归交换

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return TreeNode类
     */
    TreeNode* Mirror(TreeNode* pRoot) {
        // write code here
        if(pRoot == NULL)
            return NULL;
        TreeNode* left = Mirror(pRoot->left);
        TreeNode* right = Mirror(pRoot->right);
        
        pRoot->left = right;
        pRoot->right = left;
        
        return pRoot;
    }
};

8.26-JZ28.对称的二叉树

在这里插入图片描述
在这里插入图片描述
和上一个题思路很像,也是递归判断左右是否一样。

class Solution {
public:
    bool Judge(TreeNode* r1, TreeNode* r2){
        if(r1 == NULL && r2 == NULL)
            return true;
        if(r1 == NULL || r2 == NULL || r1->val != r2->val)
            return false;
        return Judge(r1->left, r2->right) && Judge(r1->right, r2->left);
    }
    
    bool isSymmetrical(TreeNode* pRoot) {
        return Judge(pRoot, pRoot);
    }
};

8.27-JZ29. 顺时针打印矩阵

在这里插入图片描述
这是一个纯思维题,只要能想到用上下左右来标记判断,上下或左右重合为结束标志。分别对上行、右列、下行、左列进行遍历即可。

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> res;
        int n = matrix.size();
        if(n == 0)
            return res;
        int left = 0, right = matrix[0].size() - 1;
        int up = 0, down = n - 1;
        int i;
        
        while(left <= right && up <= down){
            for(i = left; i <= right; i++)
                res.push_back(matrix[up][i]);
            up++;
            if(up > down)
                break;
            
            for(i = up; i <= down; i++)
                res.push_back(matrix[i][right]);
            right--;
            if(left > right)
                break;
            
            for(i = right; i >= left; i--)
                res.push_back(matrix[down][i]);
            down--;
            if(up > down)
                break;
            
            for(i = down; i >= up; i--)
                res.push_back(matrix[i][left]);
            left++;
            if(left > right)
                break;
        }
        return res;
    }
};

8.28-JZ30. 包含min函数的栈

在这里插入图片描述
也是比较简单的栈操作,就是用一个栈,每次判断,最小值就存,不是最小值就重复,这样每次栈顶都是现在这个栈的最小值。

class Solution {
public:
    stack<int> s;
    stack<int> m;
    void push(int value) {
        s.push(value);
        if(m.empty() || m.top() > value)
            m.push(value);
        else 
            m.push(m.top());
    }
    void pop() {
        s.pop();
        m.pop();
    }
    int top() {
        return s.top();
    }
    int min() {
        return m.top();
    }
};

8.29-JZ31. 栈的压入、弹出序列

在这里插入图片描述

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        stack<int> s;
        int n = pushV.size();
        int i = 0;
        for(int j = 0; j < n; j++){
            while(i < n && (s.empty() || s.top() != popV[j])){
                s.push(pushV[i]);
                i++;
            }
            if(s.top() == popV[j])
                s.pop();
            else
                return false;
        }
        return true;
    }
};

8.30-JZ32.从上往下打印二叉树

在这里插入图片描述

二叉树的层次遍历基础写法了。利用队列遍历节点,如果有左右子节点,就依次放队伍后面;

class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int> res;
        if(root == NULL)
            return res;
        queue<TreeNode*> q;
        q.push(root);
        TreeNode* cur;
        
        while(!q.empty()){
            cur = q.front();
            q.pop();
            res.push_back(cur->val);
            
            if(cur->left)
                q.push(cur->left);
            if(cur->right)
                q.push(cur->right);
        }
        return res;
    }
};

8.31-JZ33. 二叉搜索树的后序遍历序列

在这里插入图片描述
递归最重要的是找到左右子树的分界点,如果他是一个二叉搜索树,那么他的左边一定都比根节点小,那么从0到最后一个比根节点小的都是左子树;同理,从第一个比根节点大的位置到根节点前一个,都是右子树。如果能一直这样划分,说明是二叉搜索树,否则不是。
注意:递归的边界一定要写对,否则会超时

class Solution {
public:
    bool Judge(vector<int> sequence,int begin, int end){
        int flag = 1;
        if(begin > end)
           return true;
        int left = -1, right = end, root = sequence[end];
        for(int i = begin; i <= end; i++){
            if(sequence[i] < root){
                left = i;
            }
            if(flag && sequence[i] > root){
                right = i;
                flag = 0;
            }
        }
//         for(int i = begin; i <= end; i++){
//             if(sequence[i] > root){
//                 right = i;
//                 break;
//             }
//         }
        if(left > right)
            return false;
        
        return Judge(sequence, begin, left) && Judge(sequence, right, end-1);
    }
    bool VerifySquenceOfBST(vector<int> sequence) {
        int n = sequence.size();
        if(n == 0)
            return false;
        return Judge(sequence, 0, n-1);
    }
};

相关文章:

  • SpringBoot 启用 GZIP 对响应进行压缩
  • Java版Word开发工具Aspose.Words功能解析:查找和替换Word文档中的文本
  • Windows与网络基础-1-2-虚拟机安装Windows10和window server2016
  • C++基础 引用
  • 5分钟教会你如何搭建自己的git仓库
  • 【云原生 | Kubernetes 系列】---PromQL语句
  • 谈谈Boost网络编程(3)—— 一些坑
  • 497. 返回随机非重叠矩形中的一个坐标点
  • Referer和Referrer Policy及图片防盗链
  • ISO7816-3标准ATR解析
  • 谨慎redis的timeout参数
  • PHP 实例 - AJAX 与 XML
  • 期货开户每日无负债结算制度
  • Redis、JVM、并发、MySQL、Java、网络等一个你都“啃”不完,何谈BAT?
  • 详解 docker save 与 docker export 的区别
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 230. Kth Smallest Element in a BST
  • CSS盒模型深入
  • IndexedDB
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • ReactNative开发常用的三方模块
  • Vue 2.3、2.4 知识点小结
  • 包装类对象
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 理清楚Vue的结构
  • 如何设计一个微型分布式架构?
  • 微信开源mars源码分析1—上层samples分析
  • 小程序开发之路(一)
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Mac 上flink的安装与启动
  • ​queue --- 一个同步的队列类​
  • #Linux(make工具和makefile文件以及makefile语法)
  • #pragma预处理命令
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (二)PySpark3:SparkSQL编程
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (三)docker:Dockerfile构建容器运行jar包
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)为什么要选择C++
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转) ns2/nam与nam实现相关的文件
  • (转)程序员疫苗:代码注入
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET中 MVC 工厂模式浅析