引言第二章的主题是线性表。这一章虽然从名字上看很简单,但它实际上承担了两个非常重要的任务: 让你第一次系统理解“逻辑结构”和“存储结构”的区别 让你第一次真正面对“增删查改不同实现方式带来的效率差异”线性表这一章最重要的不是背定义,而是建立下面这个整体框架: 线性表是什么 顺序表怎么实现 链表怎么实现 它们各自适合什么场景本篇基于现有旧文章内容,把第二章的线性表、顺序表、链表体系合并成一篇完整复习文章。 图像化理解(Mermaid) mindmap root((第二章核心地图)) 线性表(逻辑结构) 顺序表(连续存储) 按位查找 O(1) 插删搬移 O(n) 链表(离散存储+指针连接) 单链表 双链表 循环链表 静态链表 一句话理解:第二章在比较“同一逻辑结构的两种实现代价”。一、线性表的定义与基本操作1. 线性表的定义线性表(Linear List)是具有相同数据类型的 n (n >= 0) 个数据元素的有限序列。当 n = 0 ...
引言第一章虽然叫“绪论”,但它并不是可有可无的铺垫。恰恰相反,这一章决定了你后面学习整本《数据结构》的观察角度。 这一章真正要解决的是三个问题: 什么是数据结构 什么是算法 怎么评价一个算法好不好 如果说后面的线性表、树、图是在讲“具体有哪些结构”,那么第一章讲的就是: 你应该用什么语言和标准去理解这些结构。 本篇基于现有旧文章 30 与 31 合并整理,形成真正完整的第一章整合版。 图像化理解(Mermaid) mindmap root((第一章主线)) 数据结构是什么 基本术语 数据 数据元素 数据项 数据对象 三要素 逻辑结构(关系) 存储结构(落地) 数据运算(做什么+怎么做) 算法是什么 五大特性 有穷 确定 可行 输入 输出 好算法标准 正确 可读 健壮 ...
引言第五章是数据结构里非常重要的一章,因为它把前面以“线性关系”为主的结构,进一步扩展到了“层次关系”和“集合划分关系”。这一章看似内容很多,实际上可以整理成三条主线: 树与二叉树的基本概念与性质 树与二叉树的存储、遍历、构造、转换 树结构的两个经典应用:哈夫曼树与并查集 如果前面线性表、栈、队列、串这些内容学的是“顺着一条线怎么组织数据”,那么这一章学的就是“怎么表示层级”和“怎么表示元素之间的归属关系”。 本篇会把第五章所有 PPT 内容合并成一篇完整文章,并且把 PPT 中只给结论、图示但没有讲透的地方一并补全。 图像化理解(Mermaid) mindmap root((第五章主线)) 树与二叉树(结构) 定义/术语/性质 存储(顺序/链式) 遍历(先中后层) 构造(前+中/后+中) 转换(树/森林<->二叉树) 树的应用(算法) 哈夫曼树(最小 WPL) 并查集(集合合并与查询) 一句话:前半章学“ ...
这篇文章记录我当前在 OpenCode 中使用的全局 skills 体系:它们分别负责什么、适合在什么场景下调用、哪些是主技能、哪些是辅助技能,以及我为什么这样组织。 下载当前导出的 OpenCode 全局 skills 压缩包: 下载 opencode-global-skills.zip 说明:压缩包里排除了 .git 元数据目录,保留的是当前实际使用的全局 skills 内容。 先说结论:我怎么理解全局 Skills我现在对全局 skills 的理解,不再是“装得越多越好”,而是更接近一套分层工具箱: 流程控制类:决定 AI 该怎么工作 通用能力类:处理文档、前端、GitHub、文件、记忆等高频任务 领域专项类:处理科研、Unity、Feishu、文档格式等专业场景 辅助增强类:补足某些主技能没有覆盖到的细粒度工作流 这样组织的好处是: 平时高频任务有稳定入口 遇到复杂任务时能自动切换到更专业的 skill 不容易因为目录太乱而把重复 skill、弱化 skill、容器目录也当成主技能使用 一、流程控制类:决定 AI 怎么工作这一类是我最重视的,因为它们不是解决 ...
这篇文章整理多种 AI IDE / CLI 的 rules、skills、上下文与常见工作流差异。 文章来源:https://linux.do/t/topic/1794526 说明:本文基于原帖内容做了整理、删减与重组,并结合个人使用习惯保留了更适合长期查阅的部分。此类工具更新很快,涉及额度、价格、会员权益、封号风控等信息时,请以官方最新说明为准。 本文使用“对比式学习法”最近我更喜欢用“对比式学习法”学习 AI 工具:同一主题不只看一个产品,而是同时对比 2~n 个工具。 这样做不一定需要线性增加时间,但能更快建立“共性”和“差异”的认识。很多功能如果只看单一产品,会以为那是“理所当然”;一旦放到多个 IDE / CLI 里横向比较,就能更容易看出哪些是通用设计,哪些只是某个产品自己的实现方式。 Rules 和 Skills 的核心区别Skill 通用 skill 名称通常需要与 SKILL.md 里的 name 保持一致 一般建议使用下划线或稳定命名,不要频繁改名 项目级 skill 往往会覆盖同名全局 skill Rules 通用 rules 更像“自 ...
题目描述LeetCode 1009. 位运算求补数 给你一个整数 n,二进制长度固定为 k(即忽略前导零)。 请你计算 n 的补数。 补数定义:将 n 的每一位二进制位取反(0 变 1,1 变 0)得到的数。 示例 1: 输入:n = 5 输出:2 解释:5 的二进制是 101,取反得到 010,即 2 示例 2: 输入:n = 7 输出:0 解释:7 的二进制是 111,取反得到 000,即 0 示例 3: 输入:n = 10 输出:5 解释:10 的二进制是 1010,取反得到 0101,即 5 解题思路核心观察对于一个二进制数 n(假设它的位数为 k),它的补数有一个简洁的数学公式: 补数 = (2^k - 1) - n 其中 2^k - 1 是一个全为 1 的 k 位二进制数(如 7 = 111₂、15 = 1111₂)。 原理图解以 n = 5 (101₂) 为例: 123原码 n: 101全1数(2^3-1): 111补数 = 111 - 101 = 010 = 2 所以我们只需要找到大于等于 n 的最小全 1 数,然后减去 n 即可。 算 ...
题目描述LeetCode 3129. 找出所有稳定的二进制数组 I 给你 3 个正整数 zero、one 和 limit。 如果一个二进制数组满足: 0 的个数恰好是 zero 1 的个数恰好是 one 任意长度大于 limit 的子数组都同时包含 0 和 1 则称该数组是稳定的。 请返回稳定二进制数组的总数,答案对 1e9+7 取模。 示例 1: 输入:zero = 1, one = 1, limit = 2 输出:2 示例 2: 输入:zero = 1, one = 2, limit = 1 输出:1 示例 3: 输入:zero = 3, one = 3, limit = 2 输出:14 解题思路这题本质是一个“带连续段限制”的计数 DP。 方法一:记忆化搜索定义 dfs(i, j, k): 还剩 i 个 0、j 个 1 可用 当前这个位置要填的数字是 k(k=0 或 k=1) 返回满足条件的方案数 最终答案: dfs(zero, one, 0) + dfs(zero, one, 1)。 关键转移(以 k=0 为例): 正常拼接来源:dfs(i-1, j, ...
Golang 即时通信系统 9 个版本迭代本文按照项目真实迭代顺序讲解: 版本一:基础 TCP Server 版本二:用户上线 版本三:消息广播 版本四:用户业务封装 版本五:在线用户查询 版本六:修改用户名 版本七:超时强踢 版本八:私聊 版本九:客户端实现 每个版本都包含两部分: 改动目标(为什么改) 关键代码(怎么改) 为了让你能边看边验证,全文额外补充了三类信息: 设计动机:为什么这一版必须做,不做会出现什么问题。 关键细节:并发、锁、通道、协议解析这些最容易踩坑的点。 可验证步骤:你可以直接在终端输入什么命令、预期看到什么结果。 先看懂架构图:系统分层与数据流这个项目的架构图可以简化成 4 层: 客户端层:client.go 负责菜单、命令输入、消息展示。 连接层:基于 TCP 长连接,每个客户端和服务端之间都有一个 conn。 服务调度层:server.go 负责监听端口、接入连接、广播分发、超时控制。 用户业务层:user.go 负责解析命令并执行业务(who、rename|、to|)。 可以把整条消息链路理解为: Client 输入 -> con ...








