自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 LeetCode 71:简化 Unix 路径(Simplify Path)——栈 / vector

给定一个 Unix 风格的path,请将其化简为规范路径。..

2025-12-15 21:29:01 562

原创 FIR 与 IIR 数字滤波器的区别总结

yn∑k0Mbkxn−kynk0∑M​bk​xn−kFIR 只有前向加权求和,没有反馈项,冲激响应在有限长度后变为 0,因此称“有限长”。维度FIRIIR冲激响应有限长无限长结构非递归(无反馈)递归(有反馈)稳定性天然稳定取决于极点位置线性相位易实现严格线性相位通常难严格线性相位阶数/运算量通常更高阶、运算大通常低阶、运算省量化敏感性低高(可能影响稳定)设计路线数字域直接设计常由模拟原型变换。

2025-12-15 21:23:12 857

原创 从前序和中序遍历重建二叉树 —— C++ 递归 + 哈希表写法解析

preorderinorder并且,要求,返回根节点TreeNode*。

2025-12-10 17:57:11 949

原创 二叉树的层序遍历

子节点(left/right)如果存在,则入队;,W 为二叉树的最大层宽(队列的最大长度)。作为“队列”的写法,常数更小、性能略优。都会给出完整 C++ 代码和复杂度分析。如果我们只需要“先进先出”,可以用一个。,每个节点只进队、出队各一次。,在大数据量时会略微更快一些。记录该节点的值到当前层向量;创建一行结果,预分配容量为。表示当前队首,访问完之后。继续下一轮,直到队列为空。会有一点额外的常数开销。的经典 BFS 写法;,表示当前层有多少节点;把节点值放进当前层结果;,这是这一层的节点数;

2025-12-08 14:21:33 419

原创 Leetcode-10.正则表达式匹配(暴力 或 记忆暴力)

表示:从s的第i个字符开始的后缀s[i:],是否能匹配模式串从第j个字符开始的后缀p[j:]。也就是把原来的变成了带下标版本的。

2025-12-03 18:10:11 864

原创 克隆图(LeetCode 133)——用数组做映射的 DFS 解法

val = _val;val = _val;给定原图中的一个起点node,要求返回这张图的深拷贝(完全独立的一份图)。

2025-11-30 20:12:50 473

原创 做题调试时遇到的问题,debug的断点的watch变量也会影响结果

cloneGraph代码是对的。错误结果是因为调试器监视表达式里用了mp[node],触发了的“自动插入”行为,导致函数提前。把那些监视表达式删掉就会恢复正常。

2025-11-30 20:03:13 361

原创 LeetCode--130被围绕的区域

给定一个m x n的矩阵board,元素为'X'或'O'被'X'包围的'O'区域要被翻转为'X'与边界联通的'O'被翻转要求:原地修改board。

2025-11-29 18:26:00 375

原创 LeetCode每日一练

题目描述(LeetCode 17):给定一个只包含数字2-9的字符串,每个数字可以映射到一组字母,比如手机九宫格键盘。要求返回所有可能的字母组合。数字与字母的对应关系如下:2 -> abc3 -> def4 -> ghi5 -> jkl6 -> mno7 -> pqrs8 -> tuv9 -> wxyz例如:输入"23"。

2025-11-27 20:55:30 419

原创 复习数据结构中的Graph,并实现模板

在数据结构中,是由一组顶点(Vertex)和一组边(Edge)组成的集合,用来描述“实体之间的关系”。顶点:用来表示对象,例如城市、用户、单词等。边:表示两个顶点之间的“连接关系”,可以是:A → BA — B用一个n × n的二维数组保存边的信息,表示节点i和j之间有边。优点:判断两点是否相连是O(1)缺点:空间复杂度O(n^2),对稀疏图浪费空间为每个顶点维护一条链(或 vector),保存它的所有邻居。优点:空间复杂度接近O(n + m)(m 为边数),适合稀疏图。

2025-11-27 19:41:04 1564

原创 LeetCode:串联所有单词的子串

每一轮中,左右指针都只往前走,整体是 O(n / wordLen) 步。在块序列上做“变形的滑动窗口 + 频率统计”,控制在 O(n) 范围内。如果某个单词在窗口内出现次数比 target 需要的多了,就移动。后面滑动窗口时,会用这个 map 来对比当前窗口里的单词频率。整体时间复杂度大致是 O(n),空间是 O(m) 存单词频率。里找出所有起始下标,使得从这个下标开始的子串,刚好是把。个单词,而且每个单词频率都不超过 target,,每个单词出现一次,不多不少,顺序可以任意。

2025-11-26 22:23:07 275

原创 LeetCode每日一练(3)

这题经典思路是“滑动窗口 + 记录每个字符最后出现的位置”。(适用任何字符集)(更快,但只适用于 ASCII)下面分别给出代码和说明。

2025-11-25 22:04:49 387

原创 LeetCode每日一练(209, 167)

版本,对负数也适用,如果就是这道题的话,就定义一个sum存left到right的全部和就行,大于就移动left,小的话就移动right。返回这两个数的下标(1-based),且保证恰好存在一对解。,所有右侧元素中,随着下标减小,和单调减小;这里的实现不是经典“全正数 + 滑动窗口”的版本,而是。有序数组 + 两数之和,是双指针的典型场景。:说明和偏小,需要增大和 → 左指针右移。:说明和偏大,需要减小和 → 右指针左移。,在其中找出两个数,使得它们的和等于。更好(区间更长,和更小或相等)

2025-11-24 22:06:54 369

原创 主题:std::list<Node>::iterator 和 Node* 的区别

Node*纯粹的裸指针类型,只表示“一块内存的地址”,不知道自己属于哪个容器,也不知道这块内存是不是链表节点。STL 定义的一个迭代器类类型,语法上表现得“像指向Node的指针”,但内部通常保存的是容器节点指针和一些额外信息,用来描述:“在这条上的某一个位置”和Node*本质类型不同Node*:裸指针iterator:类类型,封装了节点指针和容器语义语义不同Node*:只是某个对象的地址iterator:某个容器上的“位置”,属于某个实例使用接口不同迭代器支持 STL 算法、容器成员函数(如。

2025-11-24 21:18:13 1005

原创 Leetcode每日一练(392.125)

不需要回退、不需要动态规划,双指针是最优解。若 s 为空直接返回 true。使用 isalnum 判断字符是否合法,用 tolower 统一大小写比对。整个过程只需一次线性扫描。

2025-11-23 21:19:25 266

原创 NebulaChat:C++ 高并发聊天室服务端

基于 C++17 的高并发聊天室服务端,是一个涵盖现代 C++、Linux 网络编程、MySQL、Redis 的综合项目。

2025-11-22 21:07:33 984

原创 LeetCode每日一练(189, 122)

可以多次买入和卖出(不能同时持有多股),求最大利润。所以直接把所有“今天比昨天贵”的差价加起来,就是最大利润。都是线性扫描数组,加一点简单的小公式(旋转用。允许多次交易,只要不同时持有多股。备份一份原数组,避免边改边读。,股票用“所有正的差价相加”)。的元素,旋转后应该到位置。二、买卖股票的最佳时机 II。,将数组中的元素向右轮转。,就把这两天的差价加进。核心:备份原数组,用。,额外一份备份数组。

2025-11-22 19:12:46 292

原创 SQL 注入与 Redis 缓存问题总结

攻击者把恶意字符串作为输入,拼接进 SQL 语句中。数据库按“正常 SQL”执行这些内容,造成绕过登录、泄露数据、删表等后果。用户输入直接参与字符串拼接构造 SQL。遇到这种拼接,就说明写法有问题。新代码统一用预处理语句,旧代码至少先做转义。不要拼接 SQL,用预处理语句,旧代码至少先做转义。热点 key 过期瞬间被打爆,用互斥锁或逻辑过期 + 异步刷新。一堆 key 同时过期或 Redis 整体挂掉,用随机过期时间、多级缓存、预热、降级限流。

2025-11-22 19:04:55 1546 2

原创 C++ 中“编译器自动帮我传参”和“我自己写初始化”的本质区别

编译器自动帮你做的,是“默认构造成员”和“用类内默认值”,而不是“自动帮你把业务参数从外面传到里面”。当你不在初始化列表中显式写成员初始化时:类类型成员会调用默认构造有类内初始值的成员会用这个默认值一旦涉及到:同一类型不同配置(不同容量 / 大小 / 线程数)成员没有默认构造函数需要保持类的不变式参数真正要影响内部行为就必须在构造函数的初始化列表里手动传参。推荐的写法是:成员给一个合理的默认值构造函数提供可选参数在复杂类中,通过初始化列表把参数一层层地传。

2025-11-21 18:22:26 640

原创 Leetcode每日一练(80,169,189)

双指针:i 遍历原数组,k 维护写入位置不用计数器 count只需要对比 nums[k−2],逻辑更清晰二、多数元素 —— Boyer-Moore 投票法投票思想:多数元素的数量永远比其它元素多不需要额外空间这是所有解法中时间与空间最优的方案三、旋转数组 —— 三次反转法三次反转是空间最优的方法逻辑简单,面试官非常喜欢不需要额外 temp 数组整体总结题目方法时间复杂度空间复杂度技巧删除重复项 II双指针O(n)O(1)比较 nums[k−2]多数元素。

2025-11-21 18:13:00 298

原创 LeetCode每日一练(题目26.27)

今天练的题虽然不是很难,但是对于cpp而言,选择合适的STL容器去做的话效果大大不同。

2025-11-20 13:40:48 572

原创 总结我的小项目里现在用到的Redis

当前和计划中的用途:短信验证码缓存key:value: 6 位数字验证码,字符串TTL: 60 秒用途: 注册、短信登录、找回密码用户信息缓存key 示例→→用途登录时快速根据用户名 / 手机号查到用户 id减少 MySQLSELECT压力统一思想:Redis 只是加速访问的「缓存层」真正的权威数据存储在 MySQL写操作必须以 MySQL 为准,Redis 可以删、可以重新写。

2025-11-19 21:16:18 1509 2

原创 整合了c++里面常用的STL及其常用API

几乎所有 STL 容器(除少数比如array特例)都有一套共通的接口。

2025-11-18 21:08:42 1644

原创 MYSQL指令合集

【代码】MYSQL指令合集。

2025-11-15 21:36:41 577

原创 NebulaChat项目构建笔记

裸指针(T*)的问题:忘记delete→ 内存泄漏newdelete分散在各处,不好维护异常、提前 return 时很容易少写delete多个地方持有同一指针时,很容易 double free智能指针的核心思想:RAII(资源在对象生命周期结束时自动释放)。

2025-11-14 21:35:42 736

原创 epoll 事件全集、每个事件的含义、哪些事件在实际服务器中最常见、哪些会组合出现

epoll 返回的 events 是一个,可能包含多个事件组合。

2025-11-14 15:12:15 471

原创 今日内容总结

特点:有类型检查用于“本来就能转换”的情况例子:void* 转成 Connection*,int 转 double 等这里 user 原来就是 Connection*,只是通过 void* 存了一次,转回来用 static_cast 是合理、安全的。wakeup 写错 fd(应该写 evfd_)epoll_ctl 的第一个参数必须是 epfd_SO_REUSEPORT 的宏使用要小心,第二个参数是 SOL_SOCKETstart() 失败时必须把 running_ 还原为 false。

2025-11-13 21:35:44 797

原创 eventfd 初认识Reactor/多线程服务器的关键唤醒机制

在写基于 epoll 的 Reactor 框架时,一个非常常见的需求是:主线程在。

2025-11-13 19:11:40 1630 1

原创 epoll 的常用宏和API汇总

Linux 下做高并发 I/O,用 epoll 的套路是:得到epfd把你关心的 fd(socket)等内核告诉你:“这几个 fd 有事件了(EPOLLIN/EPOLLOUT/错误等)”

2025-11-13 18:45:43 1097

原创 NebulaChat 框架学习笔记:深入理解 Reactor 与多线程同步机制

如果不清空 eventfd,它的“门铃灯”会一直亮着,epoll_wait 每次都会被立即唤醒,形成死循环。

2025-11-12 21:54:29 909

原创 NebulaChat 框架学习笔记:原子变量与左值引用的工程应用

概念作用工程应用提供锁自由(lock-free)的线程安全变量操作线程停止标志、计数器、状态同步左值引用T&避免复制,直接操作原对象任务分发、日志缓冲区写入const 左值引用绑定右值,安全接收临时对象函数参数优化、字符串接口右值引用T&&实现资源转移(移动语义)对象池、消息缓冲区转移完美转发同时支持左值与右值模板函数、异步调用封装原子变量是多线程间的“通信语言”,保证数据安全;引用语义是对象传递的“性能语言”,控制资源所有权。

2025-11-11 21:42:42 1279

原创 NebulaChat 框架学习笔记

多态是“面向抽象编程”的体现,让系统可以根据对象类型自动选择行为。友元则是“受信任模块间的特例通道”,用于必要的内部访问。Reactor 模型依赖多态,实现事件类型与处理逻辑解耦;Logger 与 FileHandlerDBPool 与 DBConnection则通过友元简化内部协作;结合智能指针、原子变量和 RAII,这些机制让整个系统既安全又高效。

2025-11-11 21:39:14 751

原创 Git常用指令合集

查看配置信息。

2025-11-11 16:19:28 654

原创 一周学习总结

学会搭建简易 TCP Server,为后面聊天室打基础。“资源的获取与对象生命周期绑定,离开作用域自动释放。左栏 “Source Control” 面板即可提交;完成一个功能 → 创建分支 → 合并 → 推送。事件触发后才读取,理解“非阻塞 + 回调”。设计一个支持多客户端并发通信的聊天室服务器。掌握 Linux 下的 C++ 编译流程;:事件驱动机制,只关心“有变化”的fd。学会在项目中解耦模块,实现增量编译。:每行代码的作者与提交记录;理解多文件项目的组织结构。:遍历所有fd,性能差;

2025-11-09 22:02:13 744

原创 Hello epoll!

什么意思呢?就是不管是硬盘文件、键盘、管道、socket 网络连接……在系统眼里都是“文件”,都有一个整数编号,这个编号就叫。这个fd就是一个整数,代表系统里那个文件的“身份证号”。它也是返回一个fd,说明 socket 其实也被当作“文件”来管理的。

2025-11-03 21:43:21 465

原创 第四天学习总结:C++ 文件系统 × Linux 自动化 × Makefile 工程化

优点说明自动化一条命令搞定所有编译步骤高效率只重新编译改过的文件可维护支持多文件、多目录结构专业标准几乎所有大型 C++ 项目都用它。

2025-11-02 16:08:59 661

原创 Day3:自动化脚本与 Lambda

Linux:能写出自动编译脚本、理解日志输出与权限。C++:更理解了函数对象与 Lambda,知道它们在 STL、并发编程中常用。

2025-11-01 19:12:00 285

原创 C++ / Linux 学习 Day 2:引用、拷贝构造 与 auto.sh 自动编译脚本

掌握了:左值 / 右值 / 常量引用 的使用场景;构造函数、拷贝构造、析构函数的执行顺序;深拷贝与浅拷贝区别;运算符重载的原理与this指针;Linux 文件系统与权限命令;Shell 条件判断与自动化脚本。auto.sh自动化编译运行脚本;成功运行多文件项目;熟悉终端命令 + vim 编辑。

2025-10-31 21:24:17 1367

原创 Linux 的“用户—用户组—超级管理员(root)”到底啥关系

想象一栋写字楼:=一个个员工;=部门;=大楼物管+老板钥匙合一。文件夹就是一间间办公室;,每把锁分别设定“读/写/执行”的权限。

2025-10-31 15:47:22 358

原创 Linux 环境适应 Day 1 全面笔记

模块掌握内容Linux 命令文件操作、权限、打包、查找Shell 脚本脚本结构、变量、执行权限C++ 编译g++ 编译、运行与执行流程环境理解环境变量、路径机制Shell 不是独立知识,而是操作系统接口。Linux 下写 C++,命令行是你的 IDE。

2025-10-30 19:28:39 416

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除