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

【C++】二叉树进阶面试题

根据二叉树创建字符串

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

重点是要注意括号省略问题,分为以下情况:
1.左字树为空,右子树不为空,左边括号保留
2.左右子树都为空,括号都不保留
3。左子树不为空,右子树为空,右边括号不保留
在这里插入图片描述
如果根节点为空,返回空字符串。创建一个字符串将根节点的值转换为字符串并存储在 str 中,将整数值转化为字符串目的可以直接进行追加操作。
代码逻辑:
1.本质上是一个前序遍历,在遍历前加‘(‘遍历后加’)’
2.左子树加括号的条件用if(root->left||root->right)就完美描述,左子树为空判断第二个条件,右子树也不为空就+(),若第一条件左子树不为空直接成立也+()。调用左子树递归来追加key值到字符串中
2.只要右子树不为空就加(),调用右子树递归来追加key值到字符串中

二叉树的最近公共祖先

在这里插入图片描述
在这里插入图片描述

若直接是一棵搜索二叉树,能确定pq大小,在左子树还是右子树。
一般情况下普通树情况居多,思路:
1.一个在左边,一个在右边,当前根就是公共祖先
2.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) {}* };*/bool find(TreeNode* root,TreeNode* x){if(root==nullptr){return false;}return root==x||find(root->left,x)||find(root->right,x);}
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root==nullptr)return nullptr;//处理根节点就是pq情况if(root==p||root==q){return root;}bool pinleft,pinright,qinleft,qinright;pinleft=find(root->left,p);pinright=!pinleft;qinleft=find(root->left,q);qinright=!qinleft;//处理pq都在左边情况if(pinleft&&qinleft){return lowestCommonAncestor(root->left, p, q);}//处理都在右边情况else if(pinright&&qinright){return lowestCommonAncestor(root->right, p, q);}//处理一左一右情况else{return root;}}
};

代码逻辑:
1.创建一个find函数去查找pq值所在节点,当前根不是就按前序递归查找
2.创建pinleft等状态值,通过调用find函数来确定pq的存在情况
3.处理pq都在左子树和右子树情况,分别调用递归,成功返回root节点
4.最后pq一左一右情况直接返回根节点
精髓在于,通过递归从整个二叉树逐步缩小树的范围,pq最终会呈现出一左一右的情况。

时间复杂度分析:
find 函数最坏情况下,可能需要访问子树中的所有节点,需要遍历 O(n) 个节点。lowestCommonAncestor 函数 最坏情况下,如树是完全不平衡的(退化为链式结构),此时递归调用的次数为 O(n),所以总的时间复杂度为 O(n²)。

倒着走,转化为链表相交类似问题

 bool FindPath(TreeNode* root, TreeNode* x, stack<TreeNode*>&path){if(root==nullptr)return false;//先入栈再去判断path.push(root);if(root==x)return true;//左右递归分别寻找if(FindPath(root->left,x,path))return true;if(FindPath(root->right,x,path))return true;//找不到pop掉该路节点,换路寻找path.pop();return false;}
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*>ppath,qpath;FindPath(root,p,ppath);FindPath(root,q,qpath);//长的先走差距步,两种情况while(ppath.size()>qpath.size()){ppath.pop();}while(qpath.size()>ppath.size()){qpath.pop();}//一起走,寻找相交节点while(ppath.top()!=qpath.top()){ppath.pop();qpath.pop();}return ppath.top();}
};

FindPath查找路径函数,利用栈后进先出的特性来实现。
1.空节点返回失败,不为空先入栈,在判断是否为目标值
2.当前节点为目标值返回成功,否则通过if条件套用去递归按照前序遍历寻找
3.若没找到,要pop节点,告诉父节点该方向没有,换一个方向
lowestCommonAncestor 函数
1.pq分别创建一个栈,通过路径查找函数招到各自路径
2.相交链表处理思路,长的先走差距步,再一起走,第一次相遇点即为相交点。
3.长的先走,只要长度长于短的通过循环pop掉,最后一起走只要不相等就pop掉,最后随便返回一个栈顶元素,有可能为空。

二叉树搜索树转换成排序双向链表

在这里插入图片描述

在这里插入图片描述

思路:
因要转化成一个排序的双向链表,所以要用到中序遍历,至于如何转化成双向链表,需将中序遍历部分添加前后指针
1.前指针开始置空,链接完后更新为当前节点,当前节点往下递归,再链接,如此下去直到结束
2.后指针如何链接?我们无法预知未来,若是穿越者就可,所以当遍历到下一个节点时,将上一个节点(需判断不为空时)的后指针指向当前节点,就完成了后指针链接的难题,中序遍历最后节点的后指针一定为空。
注意:
InOrder函数传参时prev要传指针的引用,因为再递归过程中会不断开辟新的栈帧,不传引用没办法控制每个栈帧中prev相同,链接就会出问题

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

在这里插入图片描述

思路:
前序确定根节点位置,中序用来划分区间

/*** 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) {}* };*/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=prei;prei每次递归都会增加,所以在递归过程中可能让rooti错失根节点//位置,导致划分区间出现问题,会导致数组越界问题int rooti=inbegin;while(rooti<inend){if(preorder[prei]==inorder[rooti])break;rooti++;}//划分好区间[inbegin,rooti-1]rooti[rooti+1,inend]//按前序遍历依次递归,链接节点prei++;root->left=build(preorder,inorder,prei,inbegin,rooti-1);root->right=build(preorder,inorder,prei,rooti+1,inend);return root;}
class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int i=0;TreeNode*root=build(preorder,inorder,i,0,inorder.size()-1);return root;}
};

1.结束条件:创建节点函数中当初下标大于尾下标时无法构建出区间,返回空节点
2.用前序vector和其下标prei来创建节点,第一次为根节点,后面prei不断更新依次创建出前序遍历中每个节点
3.通过循环比较来找出中序vector中根节点位置,从而划分区间
4.通过递归调用按照前序遍历依次链接每个节点,返回根节点。每进行一次递归,prei都要++,直到遍历完前序vector,为确保每次递归新创建的栈帧中prei相同,参数要传引用。

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

思路:

前序遍历,最先访问到的节点是左路节点,再访问左路节点的右子树。我们可以利用栈后进先出的特性来实现
1.创建一个vector来实现最终输出,一个stack来实现遍历操作,一个cur代替根节点进行遍历
2.循环条件,当前节点cur和栈其中一个不为空。cur是访问一棵树的开始,先访问左路节点,依次如栈,节点值也依次如vector
3.依次访问左路节点的右子树,创建top取栈顶元素,再pop掉,因为已经访问过了,栈中剩余元素是未访问的。利用子问题的方式访问右子树,将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;stack<TreeNode*>st;TreeNode*cur=root;while(cur||!st.empty()){//访问的开始,先访问左子树while(cur){v.push_back(cur->val);st.push(cur);cur=cur->left;}//访问左子树的右子树TreeNode*top=st.top();st.pop();//访问右子树转化为子问题cur=top->right;}return v;}
};

总结:

通过栈后进先出特性能确保从下往上依次访问左子树的右树,满足前序性质。本质还是递归的思想,不过用循环来实现。依次访问左节点的右子树,还是会将其转化为先访问左子树,再访问左子树的右子树的子问题

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

与前序遍历的非递归思路相同,只是左路节点的访问时机不同
思路:
1.左路节点入栈 2.访问左路节点及左路节点右子树
本质:在遍历左节点过程中先不入vector,从栈中取到一个节点,意味着这个节点的左子树已经访问完了,再把当前节点入vector

因为先遍历左节点,最后肯定遇到空结束,代表最后节点左子树为空,已经访问完了,再取栈顶元素,然后pop掉,意味着当前节点的左子树已访问完,当前节点作为根节点入vector,再将当前节点更新为其右子树,满足了中序遍历性质。再取栈顶元素,旧栈顶元素(上一次pop掉的)作为当前栈顶元素的左子树已被访问过并且已经入vector,如此循环往复直到遍历完成。

/*** 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*>st;TreeNode*cur=root;while(cur||!st.empty()){//访问的开始,先访问左子树while(cur){st.push(cur);cur=cur->left;}//访问左子树的右子树TreeNode*top=st.top();st.pop();v.push_back(top->val);//访问右子树转化为子问题cur=top->right;}return v;}
};

可看出与前序遍历的非递归实现,仅仅是v.push_back(top->val);的执行顺序不同,中序遍历放在了取栈顶元素之后,而前序遍历放在了遍历左节点时直接访问

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

按照 左子树 右子树 根的顺序访问,如何在访问根节点前访问右子树呢?

采取比较的方式,容易理解和操作:
1.和中序遍历一样,先遍历左节点入栈,等取栈顶元素后再访问
2.如果当前节点的右子树没访问过,上一个访问的节点是左子树的根
3.如果当前节点的右子树已访问过,上一个访问的节点是右子树的根

/*** 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) {vector<int> v;stack<TreeNode*>st;TreeNode*prev=nullptr;TreeNode*cur=root;while(cur||!st.empty()){//访问的开始,先遍历左子树while(cur){st.push(cur);cur=cur->left;}TreeNode*top=st.top();//如果右子树为或上一个访问的节点为右子树,代表//右子树已访问完if(top->right==nullptr||top->right==prev){prev=top;v.push_back(top->val);st.pop();}else{cur=top->right;}}return v;}
};

需要创建一个prev来保存上一个访问过的节点,通过一个图来分析感受一下
在这里插入图片描述
1.先遍历左节点,124依次入栈
2.取栈顶元素4,其左子树为空相当于访问过了,其右子树为空也相当于访问过了,直接将4入vector,将prev更新为当前top,然后pop
3.继续取栈顶元素2,其左子树4已访问过,其右树不为空,更新当前结点为其右树,返回循环,划分为子问题,56依次入栈,取栈顶元素6,其左子树和右子树为空相当于访问过,直接将6入vector,然后pop。继续取栈顶元素5,其左子树6已访问过,右子树不为空,更新当前节点为其右子树,如此循环。剩下部分分析省略,思路相同
4.按照如此方式就可以完成后序遍历

相关文章:

【C++】二叉树进阶面试题

根据二叉树创建字符串 重点是要注意括号省略问题&#xff0c;分为以下情况&#xff1a; 1.左字树为空&#xff0c;右子树不为空&#xff0c;左边括号保留 2.左右子树都为空&#xff0c;括号都不保留 3。左子树不为空&#xff0c;右子树为空&#xff0c;右边括号不保留 如果根节…...

时序数据库IoTDB构建的能源电力解决方案

随着能源格局的快速变化与“双碳”战略的逐步践行&#xff0c;电力系统的绿色低碳转型已成为重要发展趋势。在这一背景下&#xff0c;数字化、智能化技术正逐步扩大在新型电力系统发电侧、电网侧、储能侧的应用&#xff0c;以推动传统电力发输配用向全面感知、双向互动、智能高…...

【KWDB 创作者计划】_上位机知识篇---Github

文章目录 前言1. GitHub 核心功能(1) 代码托管(Git 仓库)存储代码版本控制代码浏览(2) 协作开发Pull RequestlssuesProjectsDiscussions(3) 自动化与 CI/CDGitHub ActionsGitHub PagesDependabot(4) 社区与开源ForkStarWatchSponsor2. GitHub 基本使用方法(1) 创建仓库(Repo…...

vxe-table封装表头

待补充使用说明&#xff0c;但是可以用 一.效果二.封装MyTable.vue1.封装index.vue2.日期选择筛选3.输入筛选4.下拉筛选5.多选筛选6.远程多选筛选7.远程单选筛选 三、页面使用1.具体页面使用2./utils/filter.js 注意&#xff1a;需要使用jsx、vxe-table、element-plus 一.效果 …...

力扣hot100 91-100记录

91-100 &#xff08;动态规划&#xff09; class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> f(m, vector<int>(n, 1));for(int i 1; i < m; i){for(int j 1; j < n; j){f[i][j] f[i-1][j] f[i][j-1];} }return f[…...

SpringMVC处理请求映射路径和接收参数

目录 springmvc处理请求映射路径 案例&#xff1a;访问 OrderController类的pirntUser方法报错&#xff1a;java.lang.IllegalStateException&#xff1a;映射不明确 核心错误信息 springmvc接收参数 一 &#xff0c;常见的字符串和数字类型的参数接收方式 1.1 请求路径的…...

ESP32上C语言实现JSON对象的创建和解析

在ESP32上使用C语言实现JSON对象的创建和解析&#xff0c;同样可以借助cJSON库。ESP-IDF&#xff08;Espressif IoT Development Framework&#xff09;本身已经集成了cJSON库&#xff0c;你可以直接使用。以下是详细的步骤和示例代码。 1. 创建一个新的ESP-IDF项目 首先&…...

关于Qt对Html/CSS的支持

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、原生控件二、QtWebEngine总结 前言 最近遇到了一些问题需要使用Qt加载Html发现一些特性不能使用&#xff0c;估计很多人也和我一样遇到这种情况。需要说明…...

Python 读取 txt 文件详解 with ... open()

文章目录 1 概述1.1 注意事项1.2 模式说明1.3 文件准备 2 读文件2.1 读取整个文件2.2 逐行读取2.3 读取所有行到列表 3 写文件3.1 覆盖写入3.2 追加写入3.3 写入多行 4 实用技巧4.1 检查文件是否存在4.2 异常处理 1 概述 1.1 注意事项 文件编码&#xff1a;建议指定编码&…...

[Mac] 使用homebrew安装miniconda

使用虚拟环境可以对不同项目的依赖进行隔离。可以使用venv或者conda来创建和使用虚拟环境。 venv是Python内置的虚拟环境管理模块&#xff0c;适合纯Python项目以及快速轻量级的开发和部署。conda具备更强大的版本管理能力&#xff0c;但是占用较大的磁盘空间。 考虑到我基本不…...

如何获取适用于广告过滤增强的Chrome浏览器版本【广告净化】

不少人使用浏览器时&#xff0c;会遇到广告弹窗、视频前贴广告或页面跳转。这些情况会影响上网体验。想要改善&#xff0c;可以从选择合适版本的谷歌浏览器开始&#xff0c;并加上合理设置。 先打开电脑上的浏览器&#xff0c;在搜索栏中输入“谷歌浏览器官方下载页面”。找到带…...

JVM(Java虚拟机)详解

目录 1 JVM执行流程 2 JVM运行时数据区&#xff08;内存布局&#xff09; 2.1 堆 2.2 栈 2.3 方法区 2.4 程序计数器 2.5 Java和运行时数据区相关的异常 3 JVM类加载&#xff08;Class Loading&#xff09; 3.1 加载Loading 3.2 连接Linking 3.2.1 验证Verification…...

Vue3 + TypeScript,使用provide提供只读的响应式数据的详细分析与解决方法

原始无类型写法&#xff08;不报错&#xff09; typescript const applySampleTableData ref<ApplySample[]>([]); const applySampleListSymbol Symbol("applySampleList"); provide(applySampleListSymbol, readonly(applySampleTableData)); 类型推断&a…...

深入理解 BLE PHY 模式:1M、2M 与 Coded 的演进与应用

随着蓝牙技术不断演进,BLE(Bluetooth Low Energy)在物联网、可穿戴设备、智能家居等领域的应用愈发广泛。BLE 中的 PHY(Physical Layer,物理层)是决定无线传输速率、覆盖范围和功耗的核心因素。本文将以浅显易懂的语言,结合示意图和代码示例,系统梳理 BLE 三种 PHY 模式…...

人工智能与机器学习:二元分类决策树构建指南

引言 在人工智能与机器学习的领域里&#xff0c;算法犹如智慧的钥匙&#xff0c;开启着数据洞察的大门。决策树作为其中一颗璀璨的明珠&#xff0c;以其独特的非线性处理能力和可解释性备受瞩目。今天&#xff0c;让我们跟随作者的脚步&#xff0c;深入探究如何构建一个用于二…...

Ubuntu下软件运行常见异常退出问题汇总分析

软件在Ubuntu下运行时&#xff0c;可能会遇到各种异常退出情况&#xff0c;常见可分为以下几点&#xff1a; 目录 一、系统资源耗尽导致退出 二、权限导致无法运行 三、找不到依赖的动态库 四、编译可执行文件时&#xff0c;动态库所引用的头文件与动态库不匹配 一、系统资…...

机器学习漏洞大汇总——利用机器学习服务

在本节中,我们将展示机器学习框架中存在的漏洞,这些漏洞会直接处理模型工件,或者通过工件存储或模型注册表的凭证来处理。利用此类漏洞,攻击者可以在企业系统内部进行非常强大的横向移动,从而劫持被利用的模型注册表中的机器学习模型。 WANDB Weave 目录遍历 - CVE-2024-…...

类的六个默认成员函数

如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为默认…...

精益数据分析(21/126):剖析创业增长引擎与精益画布指标

精益数据分析&#xff08;21/126&#xff09;&#xff1a;剖析创业增长引擎与精益画布指标 大家好&#xff01;在创业和数据分析的探索道路上&#xff0c;我一直希望能和大家携手共进&#xff0c;共同学习。今天&#xff0c;我们继续深入研读《精益数据分析》&#xff0c;剖析…...

SAIL-RK3588协作机器人运动控制器技术方案

一、核心能力与政策适配‌ ‌政策合规性‌ 满足工信部《智能机器人重点技术攻关指南》要求&#xff0c;支持 ‌EtherCAT主站协议&#xff08;符合IEC 61158标准&#xff09;‌&#xff0c;助力企业申报工业机器人研发专项补贴&#xff08;最高300万元/项目&#xff09;‌核心板…...

手搓箱图并输出异常值(MATLAB)

看下需求 想要复刻这种箱图&#xff0c;咱们直接开始手搓 %% 可修改 % 生成模拟数据&#xff08;假设5个用户群体的发帖数&#xff09; data {randn(100,1)*10 30, ... % 核心用户randn(200,1)*5 10, ... % 边缘用户randn(150,1)*8 20, ... % 积极社交用户randn(8…...

Java:XML被自动转义

在Java中处理XML响应被自动转义的问题时&#xff0c;需结合XML规范及工具特性进行针对性处理。以下是常见原因及解决方案的总结&#xff1a; ‌一、XML自动转义的原因‌ ‌字符安全性处理‌ XML中的保留字符&#xff08;如 <、>、&&#xff09;会被自动转义为实体&a…...

Day-3 应急响应实战

应急响应实战一&#xff1a;Web入侵与数据泄露分析 1. Web入侵核心原理 ​​漏洞利用路径​​ 未授权访问&#xff1a;弱口令&#xff08;如空密码/默认口令&#xff09;、目录遍历漏洞代码注入攻击&#xff1a;JSP/ASP木马、PHP一句话木马&#xff08;利用eval($_POST[cmd])&…...

【软件设计师】模拟题一

以下是 ​​10道软考-软件设计师模拟试题​​&#xff0c;涵盖高频考点和易错点&#xff0c;附带答案和解析&#xff1a; ​​一、软件工程​​ ​​1. 在软件开发生命周期中&#xff0c;瀑布模型的主要特点是&#xff08; &#xff09;​​ A. 强调快速原型迭代 B. 阶段间有明…...

每日一练(4~24):互质的数【省模拟赛】

算法&#xff1a;暴力枚举 问题描述 如果两个整数 a, b 除了 1 以外&#xff0c;没有其它的公约数&#xff0c;则称整数 a 与 b 互质。 请问&#xff0c;与 2024 互质的数&#xff08;包括 1&#xff09;中&#xff0c;第 2024 小的是多少&#xff1f; 答案提交 这是一道结…...

金融软件测试有哪些注意事项?专业第三方软件测试服务机构分享

在现代金融行业中&#xff0c;软件系统的稳定性和安全性直接关系到资金的安全和业务的正常运转。金融软件因涉及庞大的资金流和敏感的个人及交易信息&#xff0c;对软件测试提出了更高的要求&#xff0c;那么金融软件在进行测试时有哪些注意事项呢?卓码软件测评作为专业的第三…...

关于QT信号、槽、槽函数的讲解

也是好久没有发帖子了&#xff0c;最近博主主要还是在边学QT边完成任务&#xff0c;所以进度很慢&#xff0c;但确实在这几天对于QT自身槽和信号这类特殊的机制有了一定简单的理解&#xff0c;所以还是想记录下来&#xff0c;如果有初学者看到帖子对他有一定的帮助&#xff0c;…...

算法训练营第三十天 | 动态规划 (三)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、01背包问题理论基础&#xff08;一&#xff09;动态规划五部曲确定dp数组以及下标的含义确定递推公式初始化dp数组确定遍历顺序 二、01背包问题理论基础&#…...

Vue开发网站会有“#”原因是前端路由使用了 Hash 模式

前言 网站链接中出现 #&#xff08;井号&#xff09;是因为你的前端路由使用了 Hash 模式&#xff08;hash mode&#xff09;&#xff0c;这是一种前端框架&#xff08;如 Vue.js、React 等&#xff09;中常用的路由策略。 为什么有 # 比如 https://www.zimeinew.com/#/order…...

SpringBootTest报错

Unable to find a SpringBootConfiguration, you need to use ContextConfiguration or … 解决方案&#xff1a;在SpringTest注解中添加属性&#xff08;classes &#xff09;填写启动类 如我的启动类是MainApplication.class javax.websocket.server.ServerContainer no…...

【质量管理】现代TRIZ(萃智)理论概述

一、什么是TRIZ理论 TRIZ理论,即发明问题解决理论(Teoriya Resheniya Izobreatatelskikh Zadatch),是由前苏联发明家根里奇阿奇舒勒(Genrich S. Altshuller)于1946年创立的。它是一门基于知识的、面向人的发明问题解决系统化方法学。TRIZ理论通过研究大量的专利,总结出技…...

前端面经-JS篇(四)--回调地狱、promise异步编程、Proxy 与 Reflect 、模块化

一、回调地狱 回调地狱&#xff08;Callback Hell&#xff09;&#xff0c;也称为回调地狱&#xff0c;是指在 JavaScript 中处理多个嵌套的异步回调函数时&#xff0c;代码结构变得非常难以阅读和维护的现象。 为什么会出现回调地狱&#xff1f; 回调地狱通常出现在需要执行…...

【oql】spark thriftserver内存溢出,使用oql查询导致oom的sql

eclipse memory analyzer (mat)软件内的OQL实现查询内促信息。 帮助信息&#xff1a;软件Help/Help Contents/Querying Heap Objects (OQL) 就是查询SparkExecuteStatementOperation 的statement 字段。 select objects s.statement from org.apache.spark.sql.hive.thriftser…...

算法设计与分析(基础)

问题列表 一、 算法的定义与特征&#xff0c;算法设计的基本步骤二、 算法分析的目的是什么&#xff1f;如何评价算法&#xff0c;如何度量算法的复杂性&#xff1f;三、 递归算法、分治法、贪婪法、动态规划法、回溯法的基本思想方法。四、 同一个问题&#xff0c;如TSP&#…...

爬虫学习——使用HTTP服务代理、redis使用、通过Scrapy实现分布式爬取

一、使用HTTP服务代理 由于网络环境、网站对用户的访问速度的限制等原因&#xff0c;使得爬取过程会出现IP被封禁&#xff0c;故使用代理可提高爬取速度。在Scrapy中提供了一个HttpProxyMiddleware专门用于进行爬虫代理设置。在使用该代理进行爬取操作时&#xff0c;需要先在ba…...

机器学习中的特征存储是什么?我需要一个吗?

本质上,特征存储是一个专用存储库,用于系统地存储和排列特征,主要用于数据科学家训练模型,并帮助已训练模型的应用程序进行预测。它是一个关键的聚合点,人们可以在此构建或修改从各种数据源提取的特征集合。此外,它还支持从这些特征组中创建和增强新的数据集,以满足处于…...

【C语言】C语言中的联合体与枚举类型

前言 在C语言中&#xff0c;联合体&#xff08;union&#xff09;和枚举&#xff08;enum&#xff09;是两种非常实用但又常被忽视的自定义数据类型。它们在内存管理、代码可读性以及程序设计的灵活性方面都有着独特的优势。今天&#xff0c;我们就来深入探讨一下联合体和枚举…...

Golang编程拒绝类型不安全

button-chen/containertypesafe-go: 使用泛型包装标准库的容器 list、ring、heap、sync.Pool 和 sync.Map&#xff0c;实现类型安全 简介 在 Go 中&#xff0c;标准库提供了多种容器类型&#xff0c;如 list、ring、heap、sync.Pool 和 sync.Map。然而&#xff0c;这些容器默认…...

炼锌废渣提取钴工艺流程

炼锌废渣中提取钴的工艺流程通常结合湿法冶金技术&#xff0c;针对废渣中钴与锌、铁、铜等金属的复杂共生特性&#xff0c;通过预处理、浸出、除杂、钴富集及提纯等步骤实现钴的高效回收。以下是典型工艺流程的详细说明&#xff1a; 一、预处理 炼锌废渣&#xff08;如锌浸出…...

Restful接口学习

一、为什么RESTful接口是数据开发的核心枢纽&#xff1f; 在数据驱动的时代&#xff0c;RESTful接口如同数据高速公路上的收费站&#xff0c;承担着数据交换的核心职责。数据工程师每天需要面对&#xff1a; 异构系统间的数据交互&#xff08;Hadoop集群 ↔ 业务系统&#xf…...

仿真每日一练 | ABAQUS应力松弛

应力松弛是弹性材料在应力作用下产生微塑性变形&#xff0c;并且逐渐积累&#xff0c;在保持应变或者位移不变的前提下&#xff0c;表现为应力逐渐下降的现象。今天介绍一个ABAQUS中应力松弛的相关案例&#xff0c;模型如下所示&#xff1a; 图1 模型认识 回顾一下ABAQUS的有限…...

智能电网第4期 | 电力设备全连接组网方案:从有线到无线无缝融合

随着新型电力系统建设的加速推进&#xff0c;电力设备通信网络正面临前所未有的挑战与机遇。在变电站自动化、输电线路监测、配电房智能化等场景中&#xff0c;传统通信方案已难以满足日益增长的连接需求&#xff1a; 环境复杂性&#xff1a;变电站强电磁干扰环境下需保障微秒级…...

Python 面向对象练习

不多bb了,直接上代码吧。 from pprint import pprint class Course:total_course []def __init__(self,name,id):self.name nameself.id idself.is_select FalseCourse.total_course.append(self)def __repr__(self):return (f"{__class__.__name__}("f"学…...

无感字符编码原址转换术——系统内存(Mermaid文本图表版/DeepSeek)

安全便捷无依赖&#xff0c;不学就会无感觉。 笔记模板由python脚本于2025-04-24 20:00:05创建&#xff0c;本篇笔记适合正在研究字符串编码制式的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 P…...

机器学习--线性回归模型

阅读本文之前&#xff0c;可以读一读下面这篇文章&#xff1a;终于有人把线性回归讲明白了 0、引言 线性回归作为统计学与机器学习的入门算法&#xff0c;以其简洁优雅的数学表达和直观的可解释性&#xff0c;在数据分析领域占据重要地位。这个诞生于19世纪的经典算法&#xf…...

HTML应用指南:利用GET请求获取微博签到位置信息

在当今数字化时代&#xff0c;社交媒体平台已成为人们日常生活中不可或缺的一部分。作为中国最受欢迎的社交平台之一&#xff0c;微博不仅为用户提供了一个分享信息、表达观点的空间&#xff0c;还通过其丰富的功能如签到服务&#xff0c;让用户能够记录自己生活中的点点滴滴。…...

如何检测Python项目哪些依赖库没有使用

要检测Python项目中哪些依赖库未被使用&#xff0c;可以采用以下方法&#xff1a; 1. 使用静态分析工具 vulture&#xff1a;静态分析工具&#xff0c;检测未使用的代码和导入 pip install vulture vulture your_project/pyflakes&#xff1a;检查未使用的导入语句 pip ins…...

数据仓库建设全解析!

目录 一、数据仓库建设的重要性 1. 整合企业数据资源 2. 支持企业决策制定 3. 提升企业竞争力 二、数据仓库建设的前期准备 1. 明确业务需求 2. 评估数据源 3. 制定项目计划 三、数据仓库建设的具体流程 1.需求分析​ 2.架构设计​ 3.数据建模​ 4.ETL 开发​ 5.…...

magic-api连接达梦数据库

引入依赖 然后手写驱动 <dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.1.193</version></dependency> jdbc:dm://127.0.0.1:5236?schemaSALES...

向量检索新选择:FastGPT + OceanBase,快速构建RAG

随着人工智能的快速发展&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;技术日益受到关注。向量数据库作为 RAG 系统的核心基础设施&#xff0c;堪称 RAG 的“记忆中枢”&#xff0c;其性能直接关系到大模型生成内容的精准度与…...