- 博客(32)
- 收藏
- 关注
原创 根据中序和后序遍历构建二叉树
三、解题思路四、总结这段代码是后序 + 中序构建二叉树的高效实现,核心是利用后序遍历的特性和哈希表优化,递归时 “先右后左” 的顺序是理解的关键。
2025-12-09 19:53:58
254
原创 从不订购的客户
从customers(客户表)中找出那些从未在orders(订单表)中留下订单记录的客户,最终只只显示这些客户的姓名。逻辑:如果客户表中的id(客户唯一标识)不在子查询得到的 “有订单的客户 ID 列表” 中,就会被选中。排除这些 ID”,精准筛选出从未下单的客户,适合用于 “挖掘潜在客户”“分析客户活跃度” 等场景。作用:从 “订单表”(orders)中查询所有订单对应的customerid(客户 ID)该表的每一行都表示订单的 ID 和订购该订单的客户的 ID。该表的每一行都表示客户的 ID 和名称。
2025-10-10 07:41:40
401
原创 组合两个表
Address 表:存 “人的地址信息”,关键列是 PersonId(对应Person表的 ID,确保 “101” 的地址属于张三)、City(城市,比如 “Beijing”)、State(省份 / 州,比如 “Hebei”)。Person 表:存 “人的基础信息”,关键列是 PersonId(每个人的唯一 ID,比如 “101” 代表张三)、FirstName(名,比如 “San”)、LastName(姓,比如 “Zhang”)。| 列名 | 类型 |
2025-10-10 07:28:20
763
原创 查找重复的邮箱
(4)子查询的结果会形成一个临时表,包含两列:Email(邮箱地址)和 num(出现次数),并通过 as statistic 给这个临时表起了个别名。(3)count(Email) as num 表示计算每个分组中邮箱地址的出现次数,并将这个计数结果命名为 num。(2)where num > 1 表示只选择那些出现次数(num)大于 1 的记录。(1)这部分是一个子查询,它的功能是统计每个邮箱地址在表中出现的次数。(3)最终返回这些符合条件的邮箱地址(Email)id 是该表的主键(具有唯一值的列)。
2025-10-01 21:19:20
265
原创 超过经理收入的员工
将 Employee 表自连接,分别用别名 a 和 b 表示(a 代表员工,b 代表经理)意思是:员工 a 的经理 ID 等于经理 b 的 ID(即 b 是 a 的直接上级)a.Salary > b.Salary 这个条件用于筛选出那些工资高于自己经理的员工。a.ManagerId = b.Id 这个条件用来建立员工和其直接经理的关联关系。该表的每一行都表示雇员的ID、姓名、工资和经理的ID。也就是员工 a 的薪资要大于其经理 b 的薪资。id 是该表的主键(具有唯一值的列)。建立员工与经理的关联关系。
2025-10-01 21:13:49
257
原创 C语言实现回文判断
3.交换律和结合律:异或运算的顺序不影响结果(a ^ b ^ c = a ^ c ^ b = (a ^ b) ^ c)ans 用于累计异或的结果,初始化为 0(利用异或的「恒等性」,0 作为初始值不影响后续计算)。,除了某个元素只出现一次以外,其余每个元素均出现两次。2.恒等性:任何数和 0 异或,结果还是这个数(a ^ 0 = a)1.自反性:任何数和自身异或,结果为 0(a ^ a = 0)循环结束后,ans 的值就是数组中「只出现一次的元素」。nums:整数数组的指针(待处理的数组)
2025-09-21 08:31:40
208
原创 杨辉三角*2*
填充规则:与杨辉三角的特性一致 —— 第i行的首元素(j=0)和尾元素(j=i)为 1,中间元素j(1≤j<i)等于上一行(i-1)的j-1和j元素之和。c[MX][MX] 是全局二维数组,用于存储预计算的杨辉三角所有行数据(c[i] 表示第i行的元素)。// 返回预计算好的第rowIndex行的首地址。rowIndex:需要获取的行的索引(0≤rowIndex≤33,受MX限制)。
2025-09-13 00:16:42
644
原创 杨辉三角**
这段代码通过动态内存分配创建二维数组,结合杨辉三角的特性(首尾为 1,中间元素为上两行之和),逐行填充数据,最终生成指定行数的杨辉三角,并通过输出参数返回结果的结构信息(行数和每行元素数)。内层循环 j 遍历每行的中间元素(1 到 i-1),这些元素的值等于上一行(i-1)中左侧元素(j-1)和正上方元素(j)的和(核心规则)。杨辉三角的第 i 行(从 0 开始计数)有 i+1 个元素(例如第 0 行 1 个元素,第 1 行 2 个元素,以此类推)。// 填充每行中间的元素(j从1到i-1)
2025-09-13 00:06:03
813
原创 二叉树的最大深度
这段代码通过递归分解问题:将整棵树的深度转化为「左子树深度」和「右子树深度」的最大值加 1,最终通过终止条件(空节点返回 0)回溯得到结果。
2025-09-12 23:57:19
353
原创 对称二叉树
1.核心逻辑:对称二叉树的关键是“根节点的左子树与右子树互为镜像”。镜像需满足:结构对称(对应位置节点同时存在或同时不存在),且对应节点值相等。2.函数分工:isSymmetric(主函数):直接判断根节点的左子树与右子树是否互为镜像,通过调用isSameTree实现。isSameTree(辅助函数):判断两棵树是否互为镜像(非完全相同)。
2025-08-24 22:08:05
388
原创 *相同的数*
给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
2025-08-24 21:58:10
238
原创 二叉树的中序遍历
二叉树的根节点指针(struct TreeNode 是二叉树节点的结构体,包含 val(节点值)、left(左孩子指针)、right(右孩子指针))。步骤 3:访问根节点的值(存入结果数组),对应中序遍历的 “根”;步骤 2:当左孩子为 NULL 时,栈顶是 NULL,需要退栈(top--),回到上一个有效节点(即当前子树的根节点)。这段代码是用迭代法(非递归) 实现二叉树的中序遍历(左 - 根 - 右),并返回遍历结果。:输出参数,用于返回遍历结果数组的长度(即二叉树的节点总数)。
2025-08-18 09:21:21
433
原创 合并两个有序数组
给你两个按排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你nums2到nums1中,使合并后的数组同样按排列。最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。需要合并 [1,2,3] 和 [2,5,6]。合并结果是 [,2,,5,6] ,其中斜体加粗标注的为 nums1 中的元素。[1]
2025-08-18 09:10:15
358
原创 x的平方根
这个宏定义了INT_MAX的平方根的整数部分,用于限制二分查找的右边界,避免计算m*m时发生整数溢出(如果m太大,m*m可能超过INT_MAX,导致结果错误)。若x较小(≤SQRT_INT_MAX²),right取x + 1(因为平方根不会超过x本身,如x=4的平方根最大是 2,right设为 5 即可覆盖范围);left是满足left² ≤ x的最大整数(因为再大一点的right已经满足right² > x),因此left就是x的平方根的整数部分。right² > x(右边界始终是不满足条件的解)。
2025-08-03 22:22:41
371
原创 找出字符串中第一个匹配的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1。示例 1:输入:输出:0解释:"sad" 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。示例 2:输入:输出:-1解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1。
2025-07-20 23:03:30
346
原创 移除元素。
这段代码采用了双指针算法。在不使用额外空间的情况下,将数组中所有等于val的元素移除,并返回移除后数组的新长度(原数组前k个元素为有效结果)。
2025-06-02 21:07:20
514
原创 有效的括号
给定一个只包括'('')''{''}''['']'的字符串s,判断字符串是否有效。s = "()"truetrues = "(]"falses = "([])"true仅由括号'()[]{}'组成。
2025-05-25 20:31:16
249
原创 两数之和和回文数
1.函数定义:函数接收一个整数数组nums、数组长度numsSize、目标和target,以及一个指向整数的指针returnSize用于返回结果数组的长度。4.条件判断:对于每对数nums[i]和nums[j],检查它们的和是否等于目标值target。5.未找到结果处理:如果遍历完所有数对都没有找到符合条件的组合,释放之前分配的内存,返回NULL表示无解。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。1.函数定义:函数接收一个整数x,返回一个布尔值表示x是否为回文数。
2025-05-11 22:30:55
425
原创 C语言中的三种循环语句的使用及区别:for循环,while循环,do...while循环
(1)初始化:首先执行初始化表达式,通常用于设置循环控制变量的初始值,且仅在循环开始前执行一次。若不成立,则结束循环。while循环:先判断条件是否成立,若成立则执行循环体,执行完后再次判断条件,直到条件不成立为止。(2)条件判断:然后评估条件表达式,如果值为真true(非0),则执行循环体。(4)迭代更新:执行完循环体后,再执行迭代表达式,通常用于更新循环控制变量。(5)重复过程:重复执行步骤(2-4),直到条件为假(值为flase),循环结束。(3)循环体执行:如果条件为真,执行循环体中的代码。
2024-11-03 12:43:34
3811
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅