Leetcode算法训练日记 | day22

一、二叉搜索树的最近公共祖先

1.题目

Leetcode:第 235 题

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。

示例 2:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉搜索树中。

2.解题思路

可以利用二叉树的性质来快速确定最近公共祖先的位置。在二叉树中,节点的左子树包含所有小于当前节点的值,右子树包含所有大于当前节点的值。通过比较当前节点的值与节点 p 和 q 的值,可以决定是向左子树遍历还是向右子树遍历。当找到一个节点,它的值位于 p 和 q 的值之间,或者 p 和 q 之一是当前节点时,就找到了最近公共祖先。

3.实现代码

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

// 定义一个结构体TreeNode,用于表示二叉树的节点。
struct TreeNode {
	int val; // 存储节点的值。
	TreeNode* left; // 指向该节点左子树的指针。
	TreeNode* right; // 指向该节点右子树的指针。
	// TreeNode的构造函数,用于创建一个TreeNode实例。
	// 参数x是节点的值,left和right默认为NULL,表示没有左右子节点。
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

//一、二叉搜索树的最近公共祖先(递归法)
class Solution1 {
public:
	// 定义一个名为traversal的成员函数,用于递归遍历二叉搜索树。
	// 参数cur是当前遍历到的二叉树节点指针,p和q是要查找的两个节点指针。
	TreeNode* traversal(TreeNode* cur, TreeNode* p, TreeNode* q) {
		if (cur == NULL) return cur; // 如果当前节点为空,递归结束,返回空指针。

		// 如果当前节点的值大于p和q的值,说明p和q都在当前节点的左子树中。
		// 递归遍历左子树,并将结果存储在left。
		if (cur->val > p->val && cur->val > q->val) {
			TreeNode* left = traversal(cur->left, p, q);
			// 如果在左子树中找到了p或q,返回left。
			if (left != NULL) return left;
		}

		// 如果当前节点的值小于p和q的值,说明p和q都在当前节点的右子树中。
		// 递归遍历右子树,并将结果存储在right。
		if (cur->val < p->val && cur->val < q->val) {
			TreeNode* right = traversal(cur->right, p, q);
			// 如果在右子树中找到了p或q,返回right。
			if (right != NULL) return right;
		}

		// 如果当前节点的值在p和q的值之间,或者p和q的值相等,或者p和q中至少有一个是当前节点,
		// 则当前节点是p和q的最近公共祖先。返回cur。
		return cur;
	}

	// 定义一个名为lowestCommonAncestor的成员函数,用于返回给定的两个节点p和q的最近公共祖先。
	// 参数root是二叉搜索树的根节点指针,p和q是要查找的两个节点指针。
	TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
		return traversal(root, p, q);// 调用辅助函数traversal,传入根节点root,以及要查找的两个节点p和q。
	}
};


//二、二叉搜索树的最近公共祖先(迭代法)
class Solution2 {
public:
	// 定义一个名为lowestCommonAncestor的成员函数,接受三个参数:二叉树的根节点root,以及要查找的两个节点p和q。
	TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
		while (root) {// 使用while循环遍历二叉树,直到找到最近公共祖先或到达叶子节点。
			// 如果当前节点的值大于p和q的值,说明p和q都在当前节点的左子树中。
			if (root->val > p->val && root->val > q->val) {
				root = root->left;// 将当前节点更新为左子节点,继续在左子树中查找。
			}
			// 如果当前节点的值小于p和q的值,说明p和q都在当前节点的右子树中。
			else if (root->val < p->val && root->val < q->val) {
				root = root->right;// 将当前节点更新为右子节点,继续在右子树中查找。
			}
			// 如果当前节点的值位于p和q的值之间,或者p和q的值相等,或者p和q中至少有一个是当前节点,
			// 则当前节点是p和q的最近公共祖先。返回当前节点root。
			else {
				return root;
			}
		}
		// 如果遍历完整个二叉树都没有找到满足条件的节点,返回NULL。
		// 这通常意味着p或q不存在于树中,或者树的结构有误。
		return NULL;
	}
};

二、二叉搜索树中的插入操作

1.题目

Leetcode:第 701 题

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

示例 1:

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:

示例 2:

输入:root = [40,20,60,10,30,50,70], val = 25
输出:[40,20,60,10,30,50,70,null,null,25]

示例 3:

输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5
输出:[4,2,7,1,3,5]
2.解题思路

通过遍历二叉搜索树来找到新值 val 应该插入的位置。首先检查根节点是否为空,如果为空,则创建一个新节点并返回。如果不为空,则根据val与根节点值的大小关系,
递归地在左子树或右子树中插入新值。在每个递归步骤中,函数都会返回更新后的子树指针,
这样在递归返回时可以正确地更新父节点的左或右子指针。

3.实现代码
#include <iostream>
#include <vector>
using namespace std;

// 定义一个结构体TreeNode,用于表示二叉树的节点。
struct TreeNode {
    int val; // 存储节点的值。
    TreeNode* left; // 指向该节点左子树的指针。
    TreeNode* right; // 指向该节点右子树的指针。
    // TreeNode的构造函数,用于创建一个TreeNode实例。
    // 参数x是节点的值,left和right默认为NULL,表示没有左右子节点。
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

// 一、二叉搜索树中的插入操作(递归法)
class Solution1 {
public:
    // 定义一个名为insertIntoBST的公共成员函数,接受两个参数:二叉搜索树的根节点root和要插入的整数val。
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if (root == NULL) {// 如果根节点为空,创建一个新的TreeNode实例,其值为val,并返回这个新节点作为插入点。
            TreeNode* node = new TreeNode(val);
            return node;
        }

        // 如果根节点的值大于要插入的值val,递归地在根节点的左子树中插入val。
        if (root->val > val) {
            root->left = insertIntoBST(root->left, val);
        }
        // 如果根节点的值小于要插入的值val,递归地在根节点的右子树中插入val。
        if (root->val < val) {
            root->right = insertIntoBST(root->right, val);
        }
        return root; // 在插入操作完成后,返回根节点root,以便维持递归调用的上下文。
    }
};

// 二、二叉搜索树中的插入操作(迭代法)
class Solution2 {
public:
    // 定义一个名为insertIntoBST的公共成员函数,接受两个参数:二叉搜索树的根节点root和要插入的整数val。
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if (root == NULL) { // 如果根节点为空,创建一个新的TreeNode实例,其值为val,并返回这个新节点作为新的叶子节点。
            TreeNode* node = new TreeNode(val);
            return node;
        }

        TreeNode* cur = root; // 定义当前遍历到的节点cur为根节点root,并定义父节点parent同样为root。
        TreeNode* parent = root; // 记录父节点,以便在插入新节点时能够正确链接。

        // 遍历二叉搜索树,找到新值val应该插入的位置。
        while (cur != NULL) {
            parent = cur; // 记录当前节点cur的父节点parent。
            if (val < cur->val) {
                cur = cur->left;// 如果新值val小于当前节点的值,移动到当前节点的左子树中继续查找。
            }
            else {// 如果新值val大于当前节点的值,移动到当前节点的右子树中继续查找。
                cur = cur->right;
            }
        }

        TreeNode* node = new TreeNode(val);// 创建一个新的TreeNode节点,其值为val。
        
        if (val < parent->val) {// 根据新值val与父节点parent的值的大小关系,将新节点插入到父节点的左子树或右子树中。
            parent->left = node; // 如果val小于父节点的值,则成为左子节点。
        }
        else {
            parent->right = node; // 如果val大于或等于父节点的值,则成为右子节点。
        }

        // 返回根节点root,这里的返回值实际上并不影响最终的树结构,因为函数中已经通过递归更新了所有父节点的引用。
        return root;
    }
};

三、删除二叉搜索树中的节点

1.题目

Leetcode:第 450题

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

示例 1:

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。


示例 2:

输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3:

输入: root = [], key = 0
输出: []
2.解题思路

通过遍历二叉搜索树来找到要删除的节点,并根据不同的情况(节点是叶子节点、只有左孩子、只有右孩子、左右孩子都有)来删除节点并维护树的结构。在删除节点时,需要注意释放原节点的内存,以避免内存泄漏。此外,当删除节点有两个孩子时,需要找到其右子树中最左边的节点(后继节点),将其左子树连接到当前节点的左子树上,然后删除原节点。

3.实现代码
#include <iostream>
#include <vector>
using namespace std;

// 定义一个结构体TreeNode,用于表示二叉树的节点。
struct TreeNode {
    int val; // 存储节点的值。
    TreeNode* left; // 指向该节点左子树的指针。
    TreeNode* right; // 指向该节点右子树的指针。
    // TreeNode的构造函数,用于创建一个TreeNode实例。
    // 参数x是节点的值,left和right默认为NULL,表示没有左右子节点。
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

 // 一、删除二叉搜索树中的节点(递归法)
class Solution {
public:
    // 定义一个名为deleteNode的公共成员函数,接受两个参数:二叉搜索树的根节点root和要删除的键值key。
    TreeNode* deleteNode(TreeNode* root, int key) {
        
        if (root == nullptr) return root; // 如果节点为空,直接返回空指针。

        // 如果当前节点的值等于要删除的键值key。
        if (root->val == key) {
            // 如果当前节点是叶子节点(没有左右孩子),删除节点并释放内存。
            if (root->left == nullptr && root->right == nullptr) {
                delete root; // 释放当前节点的内存
                return nullptr; // 返回空指针,表示当前节点已被删除
            }
            // 如果当前节点只有右孩子,删除节点并用右孩子补位。
            else if (root->left == nullptr) {
                auto retNode = root->right; // 保存右孩子的指针
                delete root; // 释放当前节点的内存
                return retNode; // 返回右孩子的指针,右孩子成为新的根节点
            }
            // 如果当前节点只有左孩子,删除节点并用左孩子补位。
            else if (root->right == nullptr) {
                auto retNode = root->left; // 保存左孩子的指针
                delete root; // 释放当前节点的内存
                return retNode; // 返回左孩子的指针,左孩子成为新的根节点
            }

            // 如果当前节点左右孩子都不为空,找到右子树中最左边的节点(即当前节点的后继)。
            else {
                TreeNode* cur = root->right; // 从右子树开始查找
                while (cur->left != nullptr) { // 遍历到最左边的节点
                    cur = cur->left;
                }
                
                cur->left = root->left;// 将后继节点的左子树连接到当前节点的左子树上。
                TreeNode* tmp = root; // 保存当前节点的指针,以便释放内存。
                root = root->right;  // 将当前节点的右子树提升为新的根节点。
                delete tmp;// 释放原当前节点的内存。
                return root; // 返回新的根节点
            }
        }
        // 如果当前节点的值大于要删除的键值key,递归地在左子树中删除。
        if (root->val > key) root->left = deleteNode(root->left, key);

        // 如果当前节点的值小于要删除的键值key,递归地在右子树中删除。
        if (root->val < key) root->right = deleteNode(root->right, key);
        
        return root;// 返回当前节点,以便上层递归调用可以使用修改后的树结构。
    }
};

// 二、删除二叉搜索树中的节点(迭代法)
class Solution {
private:
    // 定义一个名为deleteOneNode的私有辅助函数,用于删除一个特定的节点(目标节点)。
    // 目标节点可以有左右孩子,或者没有右孩子但有左孩子。
    // 如果目标节点没有右孩子,直接返回其左孩子(如果有的话)。
    // 如果目标节点有右孩子,找到右子树中最左边的节点(即目标节点的后继),
    // 将目标节点的左子树连接到后继节点的左孩子位置,然后返回后继节点作为新的根节点。
    TreeNode* deleteOneNode(TreeNode* target) {
        if (target == nullptr) return target; // 如果目标节点为空,直接返回。
        if (target->right == nullptr) return target->left; // 如果目标节点没有右孩子,返回其左孩子。
        TreeNode* cur = target->right; // 从目标节点的右子树开始查找后继节点。
        while (cur->left) { // 遍历到右子树的最左边节点。
            cur = cur->left;
        }
        cur->left = target->left; // 将目标节点的左子树连接到后继节点的左孩子位置。
        return target->right; // 返回后继节点作为新的根节点。
    }

public:
    // 定义一个名为deleteNode的公共成员函数,用于从二叉搜索树中删除一个键值为key的节点。
    TreeNode* deleteNode(TreeNode* root, int key) {
        if (root == nullptr) return root; // 如果根节点为空,直接返回。
        TreeNode* cur = root; // 定义当前节点cur为根节点。
        TreeNode* pre = nullptr; // 定义pre为nullptr,用来记录cur的父节点。
        // 遍历二叉搜索树,查找键值为key的节点。
        while (cur) {
            if (cur->val == key) break; // 找到目标节点,退出循环。
            pre = cur; // 更新pre为当前节点的父节点。
            if (cur->val > key) cur = cur->left; // 如果当前节点的值大于key,向左子树遍历。
            else cur = cur->right; // 如果当前节点的值小于key,向右子树遍历。
        }
        // 如果找到了要删除的节点。
        if (pre == nullptr) { // 如果要删除的节点是根节点。
            return deleteOneNode(cur); // 删除节点并返回新的根节点。
        }
        // 如果要删除的节点是pre的左孩子。
        if (pre->left && pre->left->val == key) {
            pre->left = deleteOneNode(cur); // 删除节点并更新pre的左孩子。
        }
        // 如果要删除的节点是pre的右孩子。
        if (pre->right && pre->right->val == key) {
            pre->right = deleteOneNode(cur); // 删除节点并更新pre的右孩子。
        }
        return root; // 返回根节点,此时根节点可能已经被更新。
    }
};

// 三、删除二叉搜索树中的节点(一般通用法)
class Solution {
public:
    // 定义一个名为deleteNode的公共成员函数,接受两个参数:二叉搜索树的根节点root和要删除的键值key。
    TreeNode* deleteNode(TreeNode* root, int key) {
        if (root == nullptr) return root;// 如果根节点为空,直接返回空指针。
        if (root->val == key) {// 如果根节点的值等于要删除的键值key。
            // 如果根节点(要删除的节点)有右孩子,则需要进一步处理。
            if (root->right == nullptr) { // 如果根节点只有左孩子或没有孩子。
                return root->left; // 删除根节点,返回其左孩子(如果有的话)。
            }
            // 找到根节点右子树中的后继节点,即最左边的节点。
            TreeNode* cur = root->right;
            while (cur->left) {
                cur = cur->left;
            }
            // 将后继节点的值交换到根节点(要删除的节点)的值。
            swap(root->val, cur->val); // 后继节点成为新的根节点,因为它具有相同的键值。
        }
        // 递归地在左子树和右子树中查找并删除键值为key的节点。
        root->left = deleteNode(root->left, key);
        root->right = deleteNode(root->right, key);
        return root;// 返回根节点,此时根节点可能已经被更新。
    }
};

ps:以上皆是本人在探索算法旅途中的浅薄见解,诚挚地希望得到各位的宝贵意见与悉心指导,若有不足或谬误之处,还请多多指教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/532063.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

liunx环境变量学习总结

环境变量 在操作系统中&#xff0c;环境变量是一种特殊的变量&#xff0c;它们为运行的进程提供全局配置信息和系统环境设定。本文将介绍如何自定义、删除环境变量&#xff0c;特别是对重要环境变量PATH的管理和定制&#xff0c;以及与环境变量相关的函数使用。 自定义环境变…

【复现】用友NC-Cloud文件上传漏洞_70

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 用友NC Cloud大型企业数字化平台&#xff0c;深度应用新一代数字智能技术&#xff0c;完全基于云原生架构&#xff0c;打造开放、…

MySQL进阶之(七)EXPLAIN 详解

七、EXPLAIN 详解 7.1 查询性能那些事7.1.1 查看系统性能参数7.1.2 统计 SQL 的查询成本7.1.3 定位执行慢的 SQL&#xff1a;慢查询日志01、开启慢查询日志参数02、关闭慢查询日志03、删除慢查询日志 7.1.4 查看 SQL 执行成本&#xff1a;SHOW PROFILE 7.2 EXPLAIN 语句输出中各…

pyqt5 QScrollArea组件

本示例中&#xff0c;演示了QScrollArea的使用&#xff0c;以及QScrollBar的样式设定&#xff0c;在代码中使用setStyleSheet设置样式&#xff0c;记得要优先设置scrollArea&#xff0c;再设置窗口的样式&#xff0c;不然QScrollBar的样式会不起作用&#xff0c;使用QSS设置没有…

SGD随机梯度下降

一、补充概念&#xff1a; 目标函数&#xff08;Objective Function&#xff09;&#xff1a;这个术语通常指的是整个优化问题中需要最小化&#xff08;或最大化&#xff09;的函数。在机器学习和优化中&#xff0c;目标函数可以包括损失函数以及正则化项等。目标函数的最优化过…

Python程序设计 列表

教学案例八 列表 1. 计算并显示斐波那契数列 输入n,计算并显示斐波那契数列前n项.一行打印5项&#xff0c;每项显示宽度为6 什么是斐波那契数列 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列、 因数学家莱昂纳多斐波那契&#xff…

基于SSM+Jsp+Mysql的农产品供销服务系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

windows系统安装mysql5.7

1、下载 下载路径&#xff1a;https://downloads.mysql.com/archives/community/ 2、创建配置文件my.ini 下载压缩包解压到安装目录&#xff08;本机解压后在D:\mysql-5.7.44-winx64&#xff09; 在bin的同级目录下创建my.ini文件 my.ini文件 [mysql] # 设置mysql客户端默认字符…

接口自动化测试(python+pytest+requests)

一、选取自动化测试用例 优先级高:先实现业务流程用例、后实现单接口用例功能较稳定的接口优先开展测试用例脚本的实现二、搭建自动化测试环境 核心技术:编程语言:python;测试框架:pytest;接口请求:requests安装/验证requests:命令行终端分别输入 pip install requests / p…

6.1Python之字典的初识

【1】字典的创建与价值 字典&#xff08;Dictionary&#xff09;是一种在Python中用于存储和组织数据的数据结构。元素由键和对应的值组成。其中&#xff0c;键&#xff08;Key&#xff09;必须是唯一的&#xff0c;而值&#xff08;Value&#xff09;则可以是任意类型的数据。…

国内如何实现GPT升级付款

本来想找国外的朋友代付的&#xff0c;但是他告诉我他的信用卡已经被绑定了他也升级了所以只能自己想办法了。就在一位博主下边发现了这个方法真的可以。只是需要与支付宝验证信息。刚开始不敢付款害怕被骗哈哈&#xff0c;我反诈骗意识绝对杠杠的 该方法就是我们办理一张虚拟…

3D可视化技术亮相高铁站,引领智慧出行新潮流

在科技飞速发展的今天&#xff0c;我们的生活正经历着前所未有的变革。高铁站作为现代交通的重要枢纽&#xff0c;也在不断地创新和进步。 3D可视化技术通过三维立体的方式&#xff0c;将高铁站内部和外部的结构、设施、流线等以更加直观、生动的形式呈现出来。乘客们只需通过手…

2、java语法之循环、数组与方法(找工作版)

写在前面&#xff1a;整个系列文章是自己学习慕课相关视频&#xff0c;进行的一个总结。文章只是为了记录学习课程的整个过程&#xff0c;方便以后查漏补缺&#xff0c;找到对应章节。 文章目录 一、Java循环结构1、while循环2、do-while循环3、for循环4、嵌套循环5、break语句…

我认识的建站公司老板都躺平了,每年维护费都大几十万。

这些老板们过的悠哉游哉&#xff0c;大富大贵没有&#xff0c;达到中产&#xff0c;活得舒服&#xff0c;没毛病。 企业官网每年需要交维护费主要是因为以下几个原因&#xff1a; 网站服务器和域名费用&#xff1a;企业官网需要通过服务器进行托管和访问&#xff0c;同时需要…

三种常见webshell工具的流量特征分析

又来跟师傅们分享小技巧了&#xff0c;这次简单介绍一下三种常见的webshell流量分析&#xff0c;希望能对参加HW蓝队的师傅们有所帮助。 什么是webshell webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境&#xff0c;主要用于网站管理、服务器管理、…

蓝桥杯第十二届c++大学B组详解

目录 1.空间 2.直线 3.路径 4.卡片 5.货物摆放 6.时间显示 7.砝码称重 8.杨辉三角 9.双向排序 10.括号序列 1.空间 题目解析&#xff1a;1Byte 8bit 1kb 1024B 1MB 1024kb; 先将256MB变成Byte 256 * 1024 * 1024; 再将32位 变成Byte就是 32 / 8 4&#xff1b;…

4.进程相关 2

8.内存映射 8.1 内存映射相关定义 创建一个文件&#xff0c;将保存在磁盘中的文件映射到内存中&#xff0c;后期两个进程之间对内存中的数据进行操作&#xff0c;大大减少了访问磁盘的时间&#xff0c;也是一种最快的 IPC &#xff0c;因为进程之间可以直接对内存进行存取 8.…

第十二届蓝桥杯省赛真题(C/C++大学B组)

目录 #A 空间 #B 卡片 #C 直线 #D 货物摆放 #E 路径 #F 时间显示 #G 砝码称重 #H 杨辉三角形 #I 双向排序 #J 括号序列 #A 空间 #include <bits/stdc.h> using namespace std;int main() {cout<<256 * 1024 * 1024 / 4<<endl;return 0; } #B 卡片…

JVM性能监控与调优——命令行工具

文章目录 1、概述2、jps:查看正在运行的Java进程3、jstat&#xff1a;查看JVM统计信息4、jinfo&#xff1a;实时查看和修改JVM配置参数5、jmap&#xff1a;导出内存映像文件和内存使用情况6、jhat:JDK自带堆分析工具7、jstack&#xff1a;打印JVM中线程快照8、jcmd&#xff1a;…

第一个Swift程序

要创建第一个Swift项目,请按照以下步骤操作: 打开Xcode。如果您没有安装Xcode,可以在App Store中下载并安装它。在Xcode的欢迎界面上,选择“Create a new Xcode project”(创建新Xcode项目)。在模板选择界面上,选择“App”(应用程序)。在应用模板选择界面上,选择“Si…