数据结构面试高频题解析:从建模到复杂度,破解算法面试核心

面试复盘的时候发现一个很有意思的现象:很多人背了很多“数据结构面试题以及答案”,但真到了现场还是答不好。不是记不住,而是不知道面试官问这道题的时候,到底想听什么。数据结构的面试,表面考的是算法,实际上考的是你怎么把一个模糊的问题,拆成有限的计算步骤,再在复杂度、边界、工程取舍之间找一个平衡点。这篇文章我按高频题型拆开讲,每道题都会给思路、答案、代码,以及面试官大概率会追问的变式。你把它当复习提纲用,比单纯刷题更有针对性。

1. 面试官用数据结构题,其实在筛选这四件事

很多候选人以为数据结构面试就是在考“会不会做这道题”,这是一个致命误解。面试官手上有题,但眼睛盯着的是你解决问题的整个轨迹。

1.1 第一关:建模能力

这个字符串处理要抽成一个什么样的结构?这个数组的遍历顺序能不能换一种?抽象能力差的人,拿到题就只会套“之前背过某某题”。我记得有一次面试,题目是“如何判断括号是否合法”,有个候选人上来就说用栈,但对“为什么用栈、什么时候弹出、遇到右括号时栈为空说明什么”完全说不清楚。栈当然能解,但你得让人看到你是从“最近匹配”这个直觉推出栈的。

面试官为此会观察三点:

  • 问题能不能被归纳成某种熟悉的数据结构形态;
  • 这种结构能不能简化操作;
  • 有没有主动考虑空值、单元素、重复元素这些边界。

1.2 第二关:复杂度意识

复杂度不是背时间复杂度的计算方式,而是“你选这个结构,换来了什么、牺牲了什么”。举一个最常见的例子:一个有序数组,你想快速判断某个数是否存在,可以二分;但如果数据频繁插入、删除,数组的整体搬移成本很高,此时有序的平衡树可能更合适;如果只是读多写少,哈希表又比树更好。

一个合格的候选人应该能在三十秒内给出类似的分析。关键不是说出标准答案,而是让面试官感觉到你有选择结构的意识。

1.3 第三关:边界处理

手写代码时,最常见的扣分项不是主逻辑写错,而是边界根本没人提。链表为空的边界、只有一个元素的边界、整型溢出的边界、循环退出条件的边界。这些细节决定了代码能不能跑通,也暴露了你平时有没有真正动过手写代码,而不是只在看题解。

所以你在准备面试时,不要只准备“答案”,要为每个数据结构准备一份“边界清单”。后面我会逐题展开。

2. 面试题不是考“会不会”,而是考“怎么想”

看再多的“数据结构面试题以及答案整理”,也不如自己理解一遍推导过程。这一节我们先把面试题做个分类,再逐题拆解。

2.1 白板手写题

比如反转链表、层序遍历、判断回文链表。这类题代码量不大,但很看基本功。评判标准是:能不能一次性写对,能不能说清复杂度,能不能在面试官提示后快速修正。

写白板题时有几个约定俗成的要求:

  • 函数签名先确认,不要自己默认输入是什么;
  • 变量命名要有意义,不要写p、q、tmp满天飞;
  • 循环里不要埋太长的嵌套逻辑,能提前返回就提前返回;
  • 写完代码后,主动用一个小例子手动跑一遍。

2.2 方案设计题

比如“设计一个支持随机取值的列表”“设计一个 LRU 缓存”。这类题没有标准答案,考察的是你熟悉哪些结构、能不能组合它们、能不能说明每种做法的利弊。

方案设计题最容易犯的错误是“只说思路,不谈取舍”。你回答“用哈希表加双向链表”时,一定要接着说:哈希表负责 O(1) 定位,双向链表负责 O(1) 维护顺序,两个结构通过节点对象关联,空间复杂度是 O(n)。

2.3 概念辨析题

比如“哈希表冲突怎么办”“数组和链表的区别”“平衡树和堆的区别”。这类题看起来简单,却最考验理解深度。

以“数组和链表的区别”为例,只答“数组连续存储、链表不连续”是不够的。你要结合场景说:

  • 数组的随机访问是 O(1),链表的随机访问是 O(n);
  • 数组的插入和删除在中间位置代价高,链表在已知前置节点时是 O(1);
  • 数组对缓存友好,遍历更快;链表频繁分配节点,容易产生内存碎片。

这样一套组合拳下来,面试官才会觉得你是真的用过这些结构,而不是背了八股。

3. 十道高频题,从题干到追问拆开了讲

下面进入正题。我按数据结构分类,每一道题都给出:题干、思路推导、参考代码、复杂度、面试官会怎么追问。建议你配合本地编辑器或在线代码平台,亲手敲一遍。

3.1 链表:反转链表及其变式

题干:给你单链表的头节点head,反转链表,并返回反转后的链表。

思路推导:这道题的核心是“改变指针方向”。假设当前节点是cur,它原来指向下一个节点,反转后要指向前一个节点,所以必须同时维护前驱节点prev和后续节点next。很多人写错,是因为先改了cur.next,结果找不到原来的下一个节点了。

因此正确顺序是:先保存next = cur.next,再让cur.next = prev,然后把prev移动到cur,把cur移动到next。

参考代码(Python):

class ListNode: def __init__(self, val=0, next=None): self.val = val self.next =next def reverseList(head): prev = None cur = head while cur: next_node = cur.next cur.next = prev prev = cur cur = next_node return prev

复杂度:时间复杂度 O(n),只需要遍历一次;空间复杂度 O(1),只用几个指针。

追问变式:

  • 如果是“反转链表前 N 个节点”呢?你只需要在循环里加一个计数,反转完成后让原来的头节点指向第 N+1 个节点。
  • 如果是“区间反转”,比如反转从left到right的节点?先找到left的前驱,记录区间起点,再做局部反转。
  • 递归版本怎么写?递归的终止条件是“当前节点为 None 或下一个节点为 None”,核心返回值是新的头节点。

3.2 栈与队列:用栈实现队列

题干:请你仅使用两个栈实现先入先出队列,支持push、pop、peek、empty操作。

思路推导:栈是后进先出,队列是先进先出。一个栈做不到,但两个栈可以“倒腾”出先进先出的效果。一个栈专门用于写入,叫inStack;另一个栈专门用于读取,叫outStack。

关键规则有两条:

  • 写入时直接压入inStack;
  • 读取时,只有当outStack为空,才把inStack全部倒入outStack。

第二条规则保证了队列顺序:第一次倒入后,inStack底部的元素跑到了outStack顶部,最先被弹出。之后新写入的元素都压在inStack里,不会干扰outStack已有的顺序。

参考代码(Python):

class MyQueue: def __init__(self): self.in_stack = [] self.out_stack = [] def push(self, x): self.in_stack.append(x) def _transfer(self): if not self.out_stack: while self.in_stack: self.out_stack.append(self.in_stack.pop()) def pop(self): self._transfer() return self.out_stack.pop() def peek(self): self._transfer() return self.out_stack[-1] def empty(self): return not self.in_stack and not self.out_stack

复杂度:push的均摊时间复杂度 O(1) 甚至可以说就是 O(1);pop和peek虽然偶尔要转移整个in_stack,但每个元素只会被转移一次,所以也是均摊 O(1)。空间复杂度 O(n)。

追问变式:

  • “用队列实现栈”怎么做?核心区别是队列无法直接拿到队尾。可以用一个队列,每次入队后,把前面 n-1 个元素依次出队再入队,这样最后入队的元素就排到了队首。
  • 两个栈能不能做到严格 O(1) 的pop?不能,除非你引入额外结构或者放弃先进先出的约束。

3.3 哈希表:两数之和与三数之和

题干:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。

思路推导:暴力做法是双层循环,O(n^2),面试大概率不会满意。哈希表的思路是“边遍历边查找”:每看一个数x,就检查target - x是否已经出现过,如果出现过,就找到答案。这样做的好处是只需要一次遍历,且每次查找都是 O(1)。

要注意的是:哈希表里存的是“值到下标”的映射。遍历时先查再存,避免把当前元素自己算进去。

参考代码(Python):

def twoSum(nums, target): seen = {} for i, x in enumerate(nums): if target - x in seen: return [seen[target - x], i] seen[x] = i return []

复杂度:时间复杂度 O(n),空间复杂度 O(n)。

追问变式:

  • 如果要求返回所有不重复的二元组,而不是下标呢?可以先排序,再用左右双指针,把复杂度降到 O(n),同时避免哈希表的空间开销。
  • 三数之和怎么做?固定一个数,剩下两个数用双指针在有序数组上找,整体复杂度 O(n^2)。面试要求能说清楚“如何跳过重复元素”:排序后,如果当前数和前一个数相同,直接跳过,避免产生重复三元组。

3.4 树:层序遍历与序列化

题干:给你二叉树的根节点root,返回其节点值的层序遍历,即逐层从左到右访问所有节点。

思路推导:层序遍历天然适合用队列做。先把根节点入队,然后循环:记录当前队列长度level_size,这一长度就是本层节点数;弹出level_size个节点,依次把它们的左右子节点入队。用level_size而不是while que,是为了区分“哪一层”。

参考代码(Python):

from collections import deque def levelOrder(root): if not root: return [] res = [] q = deque([root]) while q: level_size = len(q) level = [] for _ in range(level_size): node = q.popleft() level.append(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right) res.append(level) return res

复杂度:每个节点恰好入队一次、出队一次,时间复杂度 O(n);队列里最多同时存在一层的节点,空间复杂度是 O(n),最坏情况是满二叉树的最后一层。

追问变式:

  • “Z 字形遍历”怎么做?在层序遍历的基础上加一个level_index,奇数层从左到右,偶数层从右到左。实现上可以要么用deque的头尾插入,要么在拿到level列表后再做一次反转。
  • “二叉树的序列化与反序列化”怎么设计?核心是把空节点也编码进去,例如用None表示空指针,然后用先序遍历或层序遍历都可以。反序列化时递归构建左右子树。

3.5 堆:TopK 问题

题干:给定整数数组nums和整数k,请找出数组中第 K 个最大的元素。

思路推导:第一反应可能是排序,复杂度 O(n log n)。但排序会做很多无用功,因为只关心第 K 大的元素。更合适的是用一个大小为 K 的小顶堆:堆顶是这 K 个元素里最小的。遍历数组时,如果堆没满就入堆;如果堆满了,且当前元素比堆顶大,就弹出堆顶、压入当前元素。遍历结束后,堆顶就是第 K 大的元素。

为什么是小顶堆而不是大顶堆?因为第 K 大的含义是“从小到大数第 n-K+1 个”,而小顶堆的堆顶是候选集中最小的那个,当候选集大小为 K 时,最小的那个正好就是第 K 大的。

参考代码(Python,使用标准库):

import heapq def findKthLargest(nums, k): heap = [] for x in nums: if len(heap) < k: heapq.heappush(heap, x) elif x > heap[0]: heapq.heapreplace(heap, x) return heap[0]

复杂度:时间复杂度 O(n log k),空间复杂度 O(k)。当 k 远小于 n 时,比全排序快很多。

追问变式:

  • “求前 K 个高频元素”怎么做?第一步用哈希表统计频次,第二步把 “(频次,元素)” 放进大小为 K 的小顶堆,规则同上。
  • “数据流中的中位数”怎么做?维护一个大顶堆存较小的一半,一个小顶堆存较大的一半,保证两个堆的大小之差不超过 1。插入时先按大小决定进哪个堆,然后做平衡。中位数要么是某个堆顶,要么是两个堆顶的平均值。

3.6 动态规划:最长不重复子串

题干:给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

思路推导:暴力法是枚举所有子串,检查是否有重复字符,O(n^3)。优化的核心是滑动窗口:窗口[left, right]表示当前不重复子串,用哈希集合seen记录窗口里的字符。右指针不断向右扩展,如果发现新字符已经在seen中,就移动左指针,同时把左侧字符从seen移除,直到重复字符被移出窗口。

参考代码(Python):

def lengthOfLongestSubstring(s): seen = set() left = 0 ans = 0 for right, ch in enumerate(s): while ch in seen: seen.remove(s[left]) left += 1 seen.add(ch) ans = max(ans, right - left + 1) return ans

复杂度:每个字符最多被加入和移出集合各一次,时间复杂度 O(n);集合大小不超过字符集大小,空间复杂度 O(min(n, 字符集大小))。

追问变式:

  • 如果允许最多一个字符重复两次呢?把集合换成“字符到出现次数”的字典,当计数超过阈值时,移动左指针。
  • 如果要求输出最长子串本身而不是长度呢?在更新ans时同时记录left和right,最后切片即可。

4. 现场表达:说得好比写得出更占优

很多候选人不是不会做,而是不会“现场展示会做”。一场面试四十五分钟,前十分钟的沟通效率往往决定了整体印象。

4.1 拿到题先别动手,先把输入输出钉死

我见过太多人拿到题就开始写代码,结果写到一半发现:输入可能为空吗?数组是排好序的吗?返回下标还是返回元素?数值范围多大,会不会溢出?这些问题在动手前问清楚,既避免返工,又给面试官留下“考虑周全”的印象。

你可以用这样一套固定话术开场:

“我先确认一下:输入是一个数组和一个整数,数组长度可以为 0 吗?是返回下标还是返回元素?如果有多组答案,返回任意一组还是全部?”

不要觉得这是在浪费面试时间,恰恰相反,这是面试官眼里“有工程素养”的表现。

4.2 从暴力解开始,再谈优化

一个反向直觉的经验:面试时不要一上来就写最优解。更好的节奏是:

  • 先给一个最简单、正确、容易理解的暴力解;
  • 分析它的复杂度,指出瓶颈在哪;
  • 再说“我尝试用 XX 结构来优化”,给出优化方案。

这样做的价值有两个:一是即使优化方案卡壳,你也已经证明了自己能解决一个可运行的问题;二是面试官能顺着你的思考路径给提示,而不是面对一个天外飞仙的最优解无从下手。

4.3 卡壳的时候,把“我不会”换成“我不知道,但我可以试试”

如果真的遇到完全没思路的题,别沉默。沉默二十秒以上,场面会变得非常尴尬。你可以在脑中快速过一遍常用数据结构:数组、链表、栈、队列、哈希、树、堆、图、并查集、前缀树……然后开口说:

“我目前没有快速解法,但我可以先尝试暴力枚举,看看数据规模是否允许。如果数据规模较大,我考虑用哈希表来降低查找的复杂度。”

这样即使最后没解出来,面试官也会给你一个“有思路”的评价。相比直接放弃交白卷,这个分数差距极大。

5. 准备复习时,最容易踏进的三个认知误区

离面试还有两周,到底怎么复习?我结合自己和身边人的经验,讲三个最常见的误区。

5.1 误区一:死记答案,不做变式训练

在看“数据结构面试题以及答案整理”时,很多人只看这道题的标准解,然后心安理得地背下来。但面试官稍微改一个条件,比如“把数组改成链表”“把返回下标改成返回元素”“把最大改成最小”,整个思路就断掉了。

正确做法是:每做完一道题,主动给自己出三个变式。比如做完两数之和,就做三数之和、四数之和、两数之和的返回全部解版本。变式训练的目的,是让你掌握解决这类问题的底层方法,而不是记住某个题目的代码。

5.2 误区二:只刷题,不求甚解

数据结构面试不是数学竞赛,不需要做一万道题。高频题型就那么二三十道,重要的是每一道都能讲清楚三个问题:

  • 为什么选这个数据结构;
  • 复杂度是怎么计算的;
  • 哪个环节最容易写错。

我给自己的要求是:一道题即使半个月后重新做,也能在十到十五分钟内独立写出正确代码,并说出所有边界情况。达不到就说明还没掌握。

5.3 误区三:忽略手写代码的规范

很多人用编辑器习惯了自动补全,一到白板就出问题。缩进乱、变量名冲突、函数签名漏写、递归出口用错,这些都是高频问题。

面试前一周,我建议用最“原始”的方式练习:直接开一个空白编辑器,不联网,不自动补全,每道题在十分钟内手写完整。写完后自己用人脑模拟一遍样例,再考虑边界输入。这个过程虽然枯燥,却是最接近真实面试环境的训练方式。

最后分享一个小技巧:把每道题的“易错点”单独记在一页纸上。比如反转链表时“先保存 next 还是先改 cur.next”、层序遍历时“用 len(q) 固定每层大小”、两数之和中“先查再存还是先存再查”。面试前一天不看代码,只看这份易错点清单,往往比临时刷题更有用。

相关新闻

大模型API价格差距百倍?深入拆解定价逻辑与选型避坑指南

大模型API价格差距百倍?深入拆解定价逻辑与选型避坑指南

如果你最近在比对各家大模型API的定价&#xff0c;大概率已经被那一串价格数字搞晕了。同样是API接口&#xff0c;输入一千个token&#xff0c;有的平台收你上百元&#xff0c;有的平台只要几毛钱&#xff0c;差距可以拉到百倍以上。大模型API价格差多少&#xff1f;这个问题的…

2026/10/20 16:12:36 阅读更多 →
Hive 3.1.2 UDF开发全流程:从环境配置到生产注册与排错

Hive 3.1.2 UDF开发全流程:从环境配置到生产注册与排错

说个真实场景。上个月我们把数仓执行引擎从老版本迁到 Hive 3.1.2&#xff0c;运维的同学在 beeline 里注册了一批从旧环境拷贝过来的函数 jar。结果第一个函数一调用就报ClassNotFoundException。排查到最后&#xff0c;发现是一个很基础的版本匹配问题——旧 jar 里hive-exec…

2026/10/20 16:12:36 阅读更多 →
K-Means用户分群实战:从特征工程到人群画像与运营策略

K-Means用户分群实战:从特征工程到人群画像与运营策略

做数据分析这几年&#xff0c;我越来越觉得&#xff0c;所谓“懂用户”这件事&#xff0c;其实可以拆成两步&#xff1a;一是把用户行为摸清楚&#xff0c;二是把用户群体分明白。摸清楚靠的是埋点、报表、漏斗&#xff0c;分明白靠的就是聚类。而在聚类算法里&#xff0c;K-Me…

2026/10/20 16:12:36 阅读更多 →

最新新闻

Claude Code实战:宠物健康管理系统全栈开发复盘

Claude Code实战:宠物健康管理系统全栈开发复盘

1. 项目概述&#xff1a;这不是一个“AI写代码”的演示&#xff0c;而是一次真实产品级开发的完整复盘“Claude Code从零搭建新项目全流程AI实现-宠物生命周期管理App”——这个标题里藏着三个关键信息点&#xff1a;Claude Code是核心工具链&#xff0c;从零搭建强调过程完整性…

2026/10/20 18:30:19 阅读更多 →
DeepSeek本地部署避坑指南:Ollama安装与模型尺寸选择

DeepSeek本地部署避坑指南:Ollama安装与模型尺寸选择

简介&#xff1a;这份PDF资料面向对大模型感兴趣的技术爱好者与研发人员&#xff0c;聚焦DeepSeek在本地环境下的部署方法与核心训练原理&#xff0c;帮助读者以低成本方式搭建可离线运行的大模型应用。内容从本地部署的三个实操步骤切入&#xff0c;逐步延伸至LLM基础概念、Tr…

2026/10/20 18:30:19 阅读更多 →
AI培训不是一门课,而是四条职业轨道的选择题

AI培训不是一门课,而是四条职业轨道的选择题

1. 别急着报班&#xff1a;先拆解“AI培训”这个词到底在指什么很多人点开“AI培训”广告时&#xff0c;脑子里浮现的是同一个画面&#xff1a;一个穿格子衬衫的年轻人&#xff0c;在黑底白字的终端前敲出一行python train.py --modelllm&#xff0c;然后模型精度飙升、工资翻倍…

2026/10/20 18:30:19 阅读更多 →
多模态SCA与全周期协同:中间件开源风险治理实践解析

多模态SCA与全周期协同:中间件开源风险治理实践解析

最近行业中公布了一轮开源安全与风险治理优秀案例评选&#xff0c;某AI安全公司基于“多模态SCA全周期协同”的中间件开源风险治理实践&#xff0c;成功入选了“开源安全及风险治理”类别的典型案例。这不算一个堆了一堆安全工具的“面子工程”&#xff0c;而是把软件成分分析&…

2026/10/20 18:30:19 阅读更多 →
Java实现节假日/周末/工作日全量落库方案

Java实现节假日/周末/工作日全量落库方案

简介&#xff1a;本资源是一份面向Java后端开发者与数据库应用学习者的实用工具型代码包&#xff0c;解决企业级排班系统、考勤管理或日历服务中需动态生成并持久化年度工作日/周末/节假日数据的核心需求。压缩包为7z格式&#xff0c;仅含1个核心Java源文件&#xff08;SaveYea…

2026/10/20 18:30:19 阅读更多 →
微信小程序小闹钟:状态机设计与本地定时实战指南

微信小程序小闹钟:状态机设计与本地定时实战指南

简介&#xff1a;这是一份面向微信小程序初学者的练手项目资源&#xff0c;聚焦基础功能开发实践&#xff0c;特别适合刚掌握WXML/WXSS/JS三件套、希望通过完整小应用巩固开发流程的学习者。项目实现了一个具备时间设置、闹铃触发、界面交互与音效反馈的小闹钟功能&#xff0c;…

2026/10/20 18:29:17 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →