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

C++: 二叉树进阶面试题

做每件事之前都心存诚意, 就会事半功倍.

目录

  • 前言
  • 1. 根据二叉树创建字符串
  • 2. 二叉树的层序遍历Ⅰ
  • 3. 二叉树的层序遍历Ⅱ
  • 4. 二叉树的最近公共祖先
  • 5. 二叉搜索树与双向链表
  • 6. 根据一棵树的前序遍历与中序遍历构造二叉树
  • 7. 根据一棵树的中序遍历与后序遍历构造二叉树
  • 8. 二叉树的前序遍历,非递归迭代实现
  • 9. 二叉树中序遍历 ,非递归迭代实现
  • 10. 二叉树的后序遍历 ,非递归迭代实现

前言

一些面试中可能会遇到的二叉树的进阶题目, 这些题目我们也需要进行掌握.

博客主页: 酷酷学!!!

更多好文, 持续关注


正文开始

1. 根据二叉树创建字符串

题目链接: 根据二叉树创建字符串

题目描述:

在这里插入图片描述
题目思路:

根据前序遍历创建二叉树, 再递归子树之前需要加括号, 但是题目要求省略不必要的括号, 通过观察可发现

  • 左右子树都为空, 省略括号
  • 右子树为空,省略括号
  • 左为空, 右不为空, 不能省略括号

每次递归之前加上条件即可, 不要忘记将整型转化为字符串, 字符串不能直接相加整型数据

题目代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:string tree2str(TreeNode* root) {string str;if(root == nullptr)return str;str+= to_string(root->val);//两个都为空就省略括号if(root->left || root->right){str+='(';str+=tree2str(root->left);str+=')';}//右子树存在则都要括号if(root->right){str+='(';str+=tree2str(root->right);str+=')';}return str;}
};

2. 二叉树的层序遍历Ⅰ

题目链接: 二叉树的层序遍历Ⅰ

题目描述:

在这里插入图片描述

题目思路:

我们在层序遍历过程中,增加一个levelSize,记录每层的数据个数,树不为空的情况下,第1层levelSize=1,循环控制,第1层出完了,第2层就都进队列了,队列中size就是第2层的数据个数。以此内推,假设levelSize为第n层的数据个数,因为层序遍历思想为当前层结点出队列,带入下一层结点(也就是子结点),循环控制第n层数据出完了,那么第n+1结点都进队列了,队列size,就是下⼀层的levelSize。

题目代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> vv;queue<TreeNode*> q;int levelsize = 1;if(root == nullptr) return vv;q.push(root);while(levelsize){vector<int> v;while(levelsize--){TreeNode* front = q.front();v.push_back(front->val);if(front->left) q.push(front->left);if(front->right) q.push(front->right);q.pop();}vv.push_back(v);levelsize = q.size();}return vv;}
};

3. 二叉树的层序遍历Ⅱ

题目链接: 二叉树的层序遍历Ⅱ

题目描述:

在这里插入图片描述

题目思路:

107的第二个题目,思路跟上题102⼀样,只⼆维数组逆置⼀下就可以得到结果。

题目代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> vv; int levelsize = 0;queue<TreeNode*> q;if(root){q.push(root);levelsize = 1;}while(levelsize>0){vector<int> v;while(levelsize--){TreeNode* front = q.front();q.pop();v.push_back(front->val);if(front->left) q.push(front->left);if(front->right) q.push(front->right);}levelsize = q.size();vv.push_back(v);}reverse(vv.begin(),vv.end());return vv;}
};

4. 二叉树的最近公共祖先

题目链接: 二叉树的最近公共祖先

题目描述:

在这里插入图片描述

题目思路:

在这里插入图片描述

思路1:仔细观察⼀下,两个结点,最近公共祖先的特征就是⼀个结点在最近公共祖先的左边,⼀个结点在最近公共祖先的右边。⽐如6和4的公共祖先有5和3,但是只有最近公共祖先5满⾜6在左边,4在右边。

思路2:如果能求出两个结点到根的路径,那么就可以转换为链表相交问题。如:6到根3的路径为6->5->3,4到根3的路径为4->2->5->3,那么看做两个链表找交点,交点5就是最近公共祖先。

思路二时间复杂度更好一点,但是空间复杂度大一点

题目代码:

思路一:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool IsInTree(TreeNode* t,TreeNode* x){if(t == nullptr)return false;return t == x || IsInTree(t->left,x) || IsInTree(t->right,x);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr)return nullptr;if(root == p || root == q)return root;//自此开始要么都在左,要么都在右bool pInleft = IsInTree(root->left,p);bool pInright = !pInleft;bool qInleft = IsInTree(root->left,q);bool qInright = !qInleft;if((qInleft&&pInright) || (qInright&&pInleft)) return root;else if(pInleft && qInleft) return lowestCommonAncestor(root->left,p,q);else return lowestCommonAncestor(root->right,p,q);}
};

思路二:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool ancestor(TreeNode* root,TreeNode* node,stack<TreeNode*>& s){if(root == nullptr) return false;s.push(root);if(root == node) return true;if(ancestor(root->left,node,s)) return true;if(ancestor(root->right,node,s)) return true;s.pop();return false;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> pstack;stack<TreeNode*> qstack;ancestor(root,p,pstack);ancestor(root,q,qstack);while(pstack.size()>qstack.size()){pstack.pop();}while(qstack.size()>pstack.size()){qstack.pop();}while(qstack.top()!=pstack.top()){pstack.pop();qstack.pop();}return qstack.top();}
};

5. 二叉搜索树与双向链表

题目链接: 二叉搜索树与双向链表

题目描述:

在这里插入图片描述

题目思路:

搜索⼆叉树⾛中序是有序的,本题⽬要求原地修改,也就是不能创建新的结点。

思路1:中序遍历搜索⼆叉树,遍历顺序是有序的,将⼆叉树的结点指针放到⼀个vector中,再把前后结点的链接关系进⾏修改。这个思路最简单,但是需要消耗O(N)的空间复杂度。

思路2:依旧中序遍历搜索⼆叉树,遍历顺序是有序的,遍历过程中修改左指针为前驱和右指针为后继指针。记录⼀个cur和prev,cur为当前中序遍历到的结点,prev为上⼀个中序遍历的结点,cur->left指向prev,cur->right⽆法指向中序下⼀个,因为不知道中序下⼀个是谁,但是prev->right指向cur;也就是说每个结点的左是在中遍历到当前结点时修改指向前驱的,但是当前结点的右,是在遍历到下⼀个结点时,修改指向后继的。

代码如下:

/*
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public:void InOrderConvert(TreeNode* cur,TreeNode*& prev){if(cur==nullptr) return;InOrderConvert(cur->left,prev);cur->left = prev;if(prev)prev->right = cur;prev = cur;InOrderConvert(cur->right,prev);}TreeNode* Convert(TreeNode* pRootOfTree) {if(pRootOfTree==nullptr) return nullptr;TreeNode* prev = nullptr;InOrderConvert(pRootOfTree,prev);TreeNode* head = pRootOfTree;while(head->left){head = head->left;}return head;}
};

6. 根据一棵树的前序遍历与中序遍历构造二叉树

题目链接: 根据一棵树的前序遍历与中序遍历构造二叉树

题目描述:

在这里插入图片描述
题目思路:

前序的⽅式构建树,前序确定当前构建树的根,根分割中序的左⼦树和右⼦树,再分别递归构建左⼦树和右⼦树。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* build(vector<int>& preorder,vector<int> inorder,int& prei,int inbegin,int inend){if(inbegin>inend) return nullptr;//前序确定根TreeNode* root = new TreeNode(preorder[prei]);//中序分割左右子树int rooti = inbegin;while(rooti <= inend){if(preorder[prei] == inorder[rooti])break;elserooti++;}prei++;root->left = build(preorder,inorder,prei,inbegin,rooti-1);root->right = build(preorder,inorder,prei,rooti+1,inend);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int i = 0;return build(preorder,inorder,i,0,inorder.size()-1);}
};

7. 根据一棵树的中序遍历与后序遍历构造二叉树

题目链接: 根据一棵树的中序遍历与后序遍历构造二叉树

题目描述:

在这里插入图片描述
题目思路:

此题跟第六题差不多, 区别在于后续来确定根, 与上题相反, 且后续遍历的顺序是 左 右 根, 所以第二次取到是右子树的根, 故创建完根之后, 先创建右子树, 再创建根

题目代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* build(vector<int>& inorder, vector<int>& postorder,int& post,int inbegin,int inend){if(inbegin>inend) return nullptr;TreeNode* newnode = new TreeNode(postorder[post]);int rooti = inbegin;while(rooti<=inend){if(postorder[post] == inorder[rooti])break;elserooti++;}post--;newnode->right = build(inorder,postorder,post,rooti+1,inend);newnode->left = build(inorder,postorder,post,inbegin,rooti-1);return newnode;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int post = postorder.size()-1;return build(inorder,postorder,post,0,inorder.size()-1);}
};

8. 二叉树的前序遍历,非递归迭代实现

题目链接: 二叉树的前序遍历

题目描述:

在这里插入图片描述

题目思路:

在二叉树初阶刷题阶段, 我们已经实现了前序遍历的递归实现, 但是递归层数多会造成栈溢出, 所以对于非递归的实现, 我们也要掌握, 其实原理也很简单, 就是模拟递归实现的过程, 先创建一个栈, 用于记录根模拟递归的过程, 遍历左节点, 遍历之前先入栈, 此题前序遍历, 所以直接将此节点的val也插入到vector中, 直到遍历到nullptr,次时说明左子树已全部遍历完, 接着去栈顶元素, 出栈顶元素, 并且将栈顶元素的right赋值给cur,进行下一次的循环遍历, 直至栈为空, 结束的条件cur不为空说明还有右子树需要遍历, 栈不为空说明还有左子树需要遍历右子树.

代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:
//非递归前序遍历vector<int> preorderTraversal(TreeNode* root) {vector<int> v;TreeNode* cur = root;stack<TreeNode*> snode;while(cur || !snode.empty()){while(cur){v.push_back(cur->val);snode.push(cur);cur = cur->left;}TreeNode* top = snode.top();snode.pop();cur = top->right;}return v;}
};

9. 二叉树中序遍历 ,非递归迭代实现

题目连接: 二叉树的中序遍历

题目描述:

在这里插入图片描述

题目思路:

本题要求中序遍历, 基本思路与前序遍历差不多, 模拟递归的实现过程, 只不过, 本次我们左子树入栈不要进行访问, 而是遍历到左子树为nullptr时, 回退的过程在进行访问, 然后在访问右子树, 右子树也是一样的操作, 遇到不为空先不访问, 先入栈,直到栈为空时, 在进行访问, 此时访问的效果就达到 左 根 右.

代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> v;stack<TreeNode*> snode;TreeNode* cur = root;while(cur || !snode.empty()){while(cur){snode.push(cur);cur = cur->left;}TreeNode* top = snode.top();v.push_back(top->val);cur = top->right;snode.pop();}return v;}
};

10. 二叉树的后序遍历 ,非递归迭代实现

题目连接: 二叉数的后序遍历

题目描述:

在这里插入图片描述

题目思路:

还是双循环模拟递归的实现过程, 遇到节点先不放问, 先入栈, 但是我们需要先访问左, 在访问右, 最后访问根, 所以左子树遍历到空之后, 取栈顶元素访问右子树, 如果右子树为根的情况我们才能访问, 访问完之后, 出栈, 在取栈顶元素, 问题就来了, 这时又会取到栈顶元素的右子树, 那我们是否还需要再进去访问呢, 如果访问过了我们就不要访问了, 直接访问此节点, 没访问过在进行访问, 不然会陷入死循环, 这是我们额为创建一个指针来记录上一次出栈的节点, 也就是上一次访问过的节点, 如果为top->right那么就不用进入循环了, 直接pop并直接访问该节点即可, 通过模拟我们可以发现, 其实不管怎么样, 后序遍历一定是先访问的是右子树为空的那个节点.

代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> snode;TreeNode* cur = root;TreeNode* prev = nullptr;vector<int> v;while(cur || !snode.empty()){while(cur){snode.push(cur);cur = cur->left;}TreeNode* top = snode.top();if(top->right == nullptr || prev == top->right){v.push_back(top->val);prev = top;snode.pop();}else{cur = top->right;}}return v;}
};

完 这些进阶题目我们也需要进行掌握, 这样才能运筹帷幄, 创作不易 感谢点赞关注!!!

相关文章:

C++: 二叉树进阶面试题

做每件事之前都心存诚意, 就会事半功倍. 目录 前言1. 根据二叉树创建字符串2. 二叉树的层序遍历Ⅰ3. 二叉树的层序遍历Ⅱ4. 二叉树的最近公共祖先5. 二叉搜索树与双向链表6. 根据一棵树的前序遍历与中序遍历构造二叉树7. 根据一棵树的中序遍历与后序遍历构造二叉树8. 二叉树的…...

【HarmonyOS NEXT】实现网络图片保存到手机相册

【问题描述】 给定一个网络图片的地址&#xff0c;实现将图片保存到手机相册 【API】 phAccessHelper.showAssetsCreationDialog【官方文档】 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-photoaccesshelper-V5#showassetscreationdialog…...

Pytorch详解-数据模块

Pytorch详解-数据模块 torch.utils.data.Dataset数据交互模块—Dataset的功能示例系列APIsconcatSubsetrandom_splitsampler unsqueeze DataLoaderDataLoader功能支持两种形式数据集读取自定义采样策略自动组装成批数据多进程数据加载自动实现锁页内存&#xff08;Pinning Memo…...

浅谈openresty

熟悉了nginx后再来看openresty&#xff0c;不得不说openresty是比较优秀的。 对nginx和openresty的历史等在这此就不介绍了。 首先对标nginx&#xff0c;自然有优劣 一、开发难度 nginx&#xff1a; 毫无疑问nginx的开发难度比较高&#xff0c;需要扎实的c/c基础&#xff…...

【学习笔记】2024最新版SpringCloud教程

2024最新版SpringCloud教程 0 前言闲聊开篇简介 1 SpringBoot和SpringCloud版本选型 2 SpringCloud是什么能干吗 3 SpringCloud各组件的停更升级替换说明 4 项目实战之需求说明 5 项目实战之Maven父工程聚合说明和mysql驱动选择 6 项目实战之Mapper4一键生成Dao层代码 …...

Proxyless Service Mesh:下一代微服务架构体系

一、项目背景及意义 在当今的微服务架构中&#xff0c;应用程序通常被拆分成多个独立的服务&#xff0c;这些服务通过网络进行通信。这种架构的优势在于可以提高系统的可扩展性和灵活性&#xff0c;但也带来了新的挑战&#xff0c;比如&#xff1a; 服务间通信的复杂性&#…...

大数据Flink(一百一十八):SQL水印操作(Watermark)

文章目录 ​​​​​​SQL水印操作&#xff08;Watermark&#xff09; 一、为什么要有WaterMark 二、​​​​​​​Watermark解决的问题 三、​​​​​​​​​​​​​​代码演示 ​​​​​​SQL水印操作&#xff08;Watermark&#xff09; 一、​​​​​​​为什么要…...

【QGC】把QGroundControl地面站添加到Ubuntu侧边菜单栏启动

把QGroundControl地面站添加到Ubuntu侧边菜单栏启动 简介准备工作步骤 1: 创建 Desktop Entry 文件步骤 2: 编辑 Desktop Entry 文件步骤 3: 刷新应用程序菜单步骤 4: 将 QGroundControl 固定到侧边栏 环境&#xff1a; Ubuntu &#xff1a;20.04 LTS 简介 QGroundControl 是…...

PostgreSQL配置主从同步

PostgreSQL配置主从同步 1 主、备库安装postgresql软件 su - pg12 cd /home/pg12/resource tar -zxvf postgresql-12.9.tar.gz cd postgresql-12.9/ ./configure --prefix/home/pg12/soft/ make -j 16 && make install2 主、备库配置环境变量 vi ~/.bash_profile…...

基于python+django+vue的鲜花商城系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的线…...

李飞飞任CEO,空间智能公司World Labs亮相,全明星阵容曝光

人工智能的下个大方向已经出现&#xff0c;标志性学者决定下场创业。 本周五&#xff0c;一个重磅消息引爆了 AI 圈&#xff1a;斯坦福大学计算机科学家李飞飞正式宣布创办 AI 初创公司 ——World Labs&#xff0c;旨在向人工智能系统传授有关物理现实的深入知识。 李飞飞说道&…...

PyTorch详解-可视化模块

PyTorch详解-可视化模块 Tensorboard 基础与使用启动 TensorBoard访问 TensorBoard使用 TensorBoardSummaryWriter类介绍参数说明常用方法 CNN卷积核与特征图可视化参数说明返回值 混淆矩阵与训练曲线可视化混淆矩阵可视化训练曲线绘制 模型参数打印参数说明输出解释 Tensorboa…...

Bootstrap 警告信息(Alerts)使用介绍

本章将讲解警告&#xff08;Alerts&#xff09;以及 Bootstrap 所提供的用于警告的 class。警告&#xff08;Alerts&#xff09;向用户提供了一种定义消息样式的方式。它们为典型的用户操作提供了上下文信息反馈。 您可以为警告框添加一个可选的关闭按钮。为了创建一个内联的可…...

uniapp(H5)设置反向代理,设置成功后页面报错

设置反向代理后&#xff0c;页面报错图&#xff1a; 反向代理代码&#xff1a;devServer下面就是配置对应的代理&#xff0c;一般这样就没问题了 "h5": {"router": {"mode": "hash"},"devServer": {"port": 517…...

define、typedef和using的使用

define、typedef 和 using 是 C&#xff08;以及 C 语言中的 define&#xff09;中用于定义别名或简化复杂类型的三个关键字&#xff0c;但它们各自有着不同的用途和行为。下面将分别对比这三个关键字&#xff1a; 1. #define 定义方式&#xff1a;#define 是预处理指令&…...

vue element时间选择不能超过今天 时间选中长度不能超过7天

背景&#xff1a; 使用elenmet plus 组件实现时间选择&#xff1b;且日期时间选择不能超过今天&#xff1b;连续选中时间的长度范围不能超过7天 效果展示&#xff1a; 实现思路&#xff1a; 一、使用element组件自带的属性和方法&#xff1b; :disabled-date"disabledDate…...

如何 吧一个 一维数组 切分成相同等分,一维数组作为lstm的输入(三维数据)的数据预处理 collate_fn的应用

要将一个一维数组切分成相同等分&#xff0c;你可以使用 Python 的内置功能或者 NumPy 库&#xff08;如果你处理的是数值数据&#xff09;。以下是几种不同的方法&#xff1a; 方法3 pad_sequence 结合dataloader 应该是最佳方案 ### 方法 1: 使用 Python 的内置切片功能 如果…...

Remix 学习 - @remix-run/react 中主要的 hooks

在 remix-run/react 中&#xff0c;有几个常用的 hooks&#xff0c;它们帮助你在 Remix 应用中处理路由、数据加载和其他功能。以下是一些主要的 hooks&#xff1a; useLoaderData: 用于获取从 loader 函数中返回的数据。 通常在组件中调用&#xff0c;以便访问路由加载的数据…...

STL之stack

stack容器 - 先进后出” - stack是堆栈容器&#xff0c;是一种的容器。 - 头文件&#xff1a;#include <stack> stack的push()与pop()方法 stack.push(elem);//往栈头添加元素 stack.pop();//从栈头移除第一个元素 stack<int> stkInt; stkInt.push(1);stkInt…...

如何用3个月零基础入门网络安全?_网络安全零基础怎么学习

前 言 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全&#xff0c;实现自己的“黑客梦”。文章的宗旨是&#xff1a; 1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈&#xff01; →点击获取网络安全资料攻略← 一、自学…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...