工作天天CRUD,为什么还要学数据结构与算法?附零基础路线
说句实在话我带新人时最常被问的问题不是“这行代码怎么写”而是“工作里天天 CRUD我为什么要学数据结构与算法”每听到一次我都会想起自己刚入行那年的状态觉得算法题就是面试造火箭上班拧螺丝。直到有一次线上服务被慢查询拖垮我对着一条 SQL 束手无策最后靠着一张哈希表重写逻辑才把接口救回来才彻底明白这个专栏想讲的东西有多重要。这篇博文是【数据结构与算法】专栏的导学篇。我要用聊天的口吻把这门课的“开场白”讲透数据结构与算法到底是什么它究竟解决什么问题学它对你做业务、跳槽、读源码、设计系统分别有什么实际帮助最后给出一个零基础能直接照着走的学习路线。不管你是刚接触编程不久的新手还是写了两三年业务代码想补基础的朋友这篇内容都会让你用最短的时间看清这门课的全局地图避免一头扎进“背题海”的误区。不绕弯子我们直接开始。整个专栏会分成六个大模块推进本篇先解决“为什么学”和“怎么学”这两个最根本的问题后面每一篇都会对应具体的知识板块和可复现代码。1. 先回答那个最直接的问题数据结构和算法到底在解决什么很多教程一上来就列概念数组、链表、二叉树、动态规划……读者看了三天还在背定义越背越懵。我比较建议大家换个角度想计算机能执行的指令极其简单但它最擅长做重复的事而我们写程序的目标本质上就是想办法把“现实问题”翻译成“计算机擅长处理的形式”。这里面的两个环节正好对应数据和算法。1.1 用一句经典公式拆开看程序 数据结构 算法很多人可能听过这句话但没认真琢磨过。我拆开讲一下我的理解。数据结构解决的是“数据怎么组织”的问题。同样的十个数字散乱摆在那里和排好序摆在那里你找其中某个数字的代价是完全不同的。前者只能一个个比较后者可以每次砍掉一半。组织方式变了操作成本就变了这就是数据结构的意义。算法解决的是“怎么处理数据”的问题。数据组织好了接下来要增删改查、要排序、要搜索、要统计怎么一步步做最高效这是算法的事。举一个特别生活化的例子图书馆。书散在地上你找一本《数据结构》可能要翻几小时按编号摆在书架上你按分类去找几分钟就能拿到。书架上的分类编号规则就是“组织方式”对应数据结构你根据编号定位到某个架位的查找方法就是“处理方式”对应算法。两者密不可分结构决定了哪些算法变得高效算法又反过来依赖于结构本身。那为什么我们平时写业务代码感觉用不上因为现代编程语言把太多东西封装好了。你调用一个列表的查找方法语言底层自动帮你做了一个线性扫描你没察觉你用字典存数据底层自动做了哈希映射你也没察觉。框架和类库把底层细节藏了起来于是初学者产生了“根本不需要懂原理”的错觉。一旦数据量变大、场景变复杂这些“不察觉”就会变成线上的超时和机器告警。1.2 从找钥匙和做菜这两个场景感受算法思维的差别这里补充两个我在实际教学里比较爱用的例子用来帮助零基础读者建立直觉。第一个例子是找钥匙。假设你把钥匙随手丢在房间的某个角落要找它只能一个角落一个角落地翻但如果你每次回家都固定把钥匙挂在玄关的挂钩上找钥匙的时间几乎为零。这里“固定的挂钩”就是一种数据结构“直接走到挂钩处取”就是一种算法。你看数据结构决定了你的查找算法能有多快。第二个例子是做菜。同样做一道番茄炒蛋有人先烧热油再打蛋有人先打蛋再热油差别看似不大但如果同时要做三道菜锅只有一个怎么安排炒菜顺序让最后一道菜上桌时不凉这就是“调度算法”的思维。算法思维本质上就是“在资源有限的前提下找到最优操作顺序”的思考方式。这种思维方式不只在代码里有用你在日常生活中其实一直在用只是没有给它起名字。1.3 我把它翻译成一句话复杂度意识学数据结构和算法最核心的收获不是记住某种树怎么旋转而是建立起“复杂度意识”——拿到一个问题先估算它的规模再估算不同方案的时间和空间成本最后决定用哪套方案。这种意识一旦建立你写代码和做架构设计的品位都会明显不一样。举个例子你的接口需要判断一个用户是不是某个群组的成员群组用户量从1万涨到100万。如果你用数组一遍遍遍历每次调用都要扫描几十万条数据并发一高必然扛不住但如果用哈希表存储成员关系查询复杂度接近常数级同样规模的流量也能稳稳支撑。同一个业务需求因为数据结构选型不同性能和成本差出几个数量级。所以数据结构与算法并不是和业务开发对立的“学院派知识”它恰恰是决定业务代码能不能支撑业务规模的关键底层能力。理解到这一层我们才能真正说清楚“为什么要学”。2. 学习数据结构与算法对你的实际工作有什么用如果上面那些还偏理念这一节我们落到非常实在的日常开发场景。我尽量少讲虚的多举那些你明天上班就可能碰到的情况。2.1 业务开发里的“隐形算法”数都数不清很多人觉得业务代码就是“接口接参数、查数据库、拼字段、返回给前端”好像完全没有算法发挥的空间。但只要你认真审视一下就会发现算法无处不在。举几个常见的例子。比如一个电商订单列表前端要求按时间倒序展示同时支持按状态筛选、分页加载。你没多想直接调数据库的排序和分页数据量小的时候一切正常。可当订单量到了几百万又赶上大促你会发现某个筛选条件的查询走了全表扫描整个接口的响应时间从200毫秒飙到3秒。这时候懂不懂“索引底层的 B 树是排好序的结构它天然适合范围查询”就决定了你是能准确建出组合索引还是只能病急乱投医地乱加索引。再比如你做一个社交应用的好友推荐功能。用户的好友关系天然是一张图想找“好友的好友”就得做图的遍历。你要是完全不理解广度优先遍历的层数含义写出来的推荐逻辑要么绕了远路要么在数据量大时把内存彻底打满。还有一个几乎天天都在发生的场景去重。从外部接口拉回一批数据要根据某个唯一键过滤掉重复项。新手会写双重循环10万条数据能跑到天荒地老懂一点的人用哈希集合一次遍历就完成。这背后就是哈希表的原理难吗不难但不懂的人会写出时间复杂度为平方级的代码而不自知。这类“隐形算法”遍布你熟悉的各个角落排序、查找、分组、去重、缓存淘汰、任务调度、限流计数、字符串匹配……写业务代码确实不需要自己从零实现红黑树但你至少要能认出当前的场景对应哪种经典问题知道该用什么工具以及为什么。这就是数据结构与算法的第一层工作价值让你做出靠谱的技术选型和性能预估。2.2 面试是一道绕不开的门槛但别再把它只当门槛说到面试大家情绪通常很复杂。一方面觉得算法题折磨人另一方面又不得不承认大厂和不少中大型公司都把它当作技术面的必考环节。我自己做过面试官也见过很多候选人关于这件事我一个真实的看法是面试考算法并不完全是在刁难人。它至少考察了三件事第一候选人有没有基本的逻辑抽象能力能不能把一个问题分解成可计算的步骤第二有没有复杂度意识知道自己的方案在极端数据下会不会出事第三有没有学习耐力数据结构与算法知识点很多没有足够沉淀的人往往只背会了表面几道题。所以从这个角度说面试考算法其实是一种“底线筛查”。但我要特别强调一句如果只为了过面试去刷题见效最快却也最容易让自己产生“我懂算法”的错觉。我见过不少候选人能把经典的动态规划题背得滚瓜烂熟但一问他“你线上有没有遇到过类似的重复子问题”立刻语塞。真正有效的学习方式是把算法当成理解计算机系统的一种语言而不是题库里的标准答案。等你拥有这种理解力面试题只是顺带的结果。2.3 读源码、做架构、排查线上问题基础决定你能走多远工作三五年后很多人会发现一个分水岭有的人还在一个接口一个接口地堆业务代码有的人已经开始读框架源码、做底层性能优化、设计中间件了。差距从哪来很大程度就是数据结构与算法的基础。不信你找一个常见的开源框架源码翻开看看。缓存组件里到处是哈希表和无环链表的设计任务调度器里有优先队列的身影网络框架里事件循环的数据结构、连接管理里的双向链表退场逻辑全都逃不开这些基础构件。不懂底层数据结构你看源码只能看到调用关系看不到设计意图懂了之后再看你能读出“作者为什么用这个结构而不用那个结构”的动机收获是完全不一样的。做架构设计也一样。一个消息队列要不要做批量合并一个分布式缓存要采用什么淘汰策略一个计数器在超高并发下怎么避免竞争这些问题的答案本质上都指向你头脑里那套数据结构与算法知识体系。它们像是地基表面上看不见但楼能盖多高完全取决于地基深不深。3. 零基础入门数据结构和算法的路线与避坑经验聊完动机再说方法。我知道很多人不是不想学是不知道怎么学一上来就被劝退。这里我给一条自己实践过、也带人验证过的路线尽量降低起步门槛。3.1 前置知识准备清单其实你比想象中更够格很多人以为学数据结构必须先把数学学透或者先精通某种语言。真不用。我觉得有必要的最低前置条件就三条一是有一门正在使用的编程语言会写循环、函数、数组、对象这些基本语法二是知道基本的时间复杂度的直觉概念比如“嵌套循环通常比单层循环慢”三是有一颗愿意动手实验的心。满足这三条就足够开始学了。不太需要你提前啃高数补救也不需要一个完美的IDE和复杂环境电脑上装一个能跑代码的环境就行。拿我自己常用的环境举例本地跑 Python 或者 JavaScript 做验证都很方便数据结构与算法阶段的样例代码通常短小不需要重型工程化配置。如果你是学生哪怕你只学了C语言的循环和数组也已经具备了起步条件。不要被“算法需要数学天才”这种话劝退这个领域百分之九十的内容靠的是持续的刻意练习不是天赋。3.2 一条亲测有效的学习路径从结构到算法再到刷题我给这条路径起名叫“主线推进法”核心是不要东一榔头西一棒子按依赖关系把知识串起来。第一步先啃“线性结构”数组、链表、栈、队列、哈希表。这些是最日常的工具理解成本低见效快。尤其数组和链表要亲手实现增删改查画图理解指针指向的变化直到烂熟于心。第二步进入“树形结构”重点掌握二叉树、二叉搜索树、堆以及树的遍历方式前序、中序、后序、层序。树的内容比线性结构抽象但它打开的是“层级组织数据”这一全新视角。很多让人头疼的递归题本质上都是在处理树结构。第三步理解“图”和基础搜索算法图的存储方式邻接矩阵、邻接表、深度优先搜索和广度优先搜索。到这里你已经能解决大量真实世界的建模问题。第四步才是“算法设计思想”排序算法重点理解归并和快排的思想不要死记代码、二分查找、动态规划入门、贪心算法。注意顺序——先掌握结构再学算法。结构是载体算法是结构上的操作顺序反了会很难受。最后一步专项突破“经典题和面试题”。这时候再去刷题平台有目的性地刷你会发现很多题目一眼就能归类到某个知识点解题思路自然浮现。刷题不要贪多每天两到三道高频题连续坚持三个月效果远超三天打鱼两天晒网。3.3 新手最容易踩的三个坑以及我怎么绕开的我把带新人和自己踩过的坑浓缩成三个都比较有代表性。第一个坑是“只看不写”。数据结构特别吃手感你盯着链表反转的代码看一百遍不如自己动手写一遍。哪怕写得磕磕绊绊、报错不断也比背诵源码有价值。我自己的习惯是每学完一个结构关上教程用白纸把结构图和核心操作手写一遍。写不出来就回头再看再写直到能默写为止。第二个坑是“不做复杂度分析”。很多人写完一个能跑的版本就心满意足了从不问一句“这个版本的代价是多少”。这样学的只是皮毛。我强烈建议在每道题写完后花两分钟标注一下它的时间复杂度和空间复杂度并且尝试问自己能不能更好一旦你养成了这个习惯写代码的思维方式会明显不一样。第三个坑是“一上来就挑战高难题目”。难度跨度太大非常打击信心。正确做法是层层递进先做“看得懂答案”的基础题再做“需要稍加思考”的中等题最后才碰高难题目。很多基础不牢的人一上来看别人发的高阶题解被震撼之后就放弃了其实完全没有必要难度曲线要和自己的能力匹配才最有效。还有一个我自己特别喜欢的小技巧把学过的每个知识点都整理成一张类似“速查卡”的东西一面写“什么时候用”一面写“复杂度是多少”一面写“典型例题”。后期复习时翻卡片比翻书高效得多。4. 这个专栏接下来怎么带大家走内容规划与建议既然这是专栏导学我必须把后面的地图铺给你让你明确知道自己将走到哪里。这份规划不是拍脑袋定的是按学习依赖关系和实战频率反复调整过的。4.1 内容编排逻辑从结构认知到综合应用专栏一共打算按四个阶段推进。第一阶段是“底子篇”我们会把数组、链表、栈、队列、哈希表全部讲透每个结构都配上图解、实现代码和复杂度分析。这一阶段的目标不是“见过”而是“能默写、能讲清、能对比”。第二阶段是“树与图篇”重点覆盖二叉树、二叉搜索树、堆、图的存储与遍历。每一块我都会结合一个具体场景来讲比如用堆实现一个优先级队列用图解决一个最短路径问题。先理解场景再理解抽象结构是这套专栏一以贯之的方法。第三阶段是“核心算法篇”选取排序、二分查找、滑动窗口、双指针、回溯、动态规划和贪心这几个高频考点每个都从“朴素解法”讲起逐步优化到“更优解法”让你亲眼看到算法优化是怎么一步步发生的。第四阶段是“实战与综合篇”我们专门做一个系列把真实业务问题抽象成算法题比如设计一个带过期时间的缓存、实现一个支持高并发的计数器、做一个朋友圈时间线分页方案。这些题目会综合前面所有知识点强化你把算法落到工程里的能力。4.2 配套练习与输出方法只输入不输出等于白学专栏不能只讲不练。每个重点小节后面我都会布置一组练习量不大但要求动手。我的理念是“少而精”宁可精做十道题也不要泛做一百道。具体建议你准备一个实验笔记每学完一个主题都输出三样东西一是这个主题解决了什么问题二是核心操作的流程与复杂度三是你亲手写出的一个例子程序。别小看这三行笔记用输出倒逼输入学一遍顶别人学三遍。另外我很推荐“教别人”这个方法。找个朋友或者干脆在文档里自言自语尝试把学到的内容用自己的话讲一遍。讲着讲着你就会发现自己哪里还没理解透。那些讲不通的地方正是你真正需要回头补的地方。4.3 给读者的起步建议从今天就能做的三件事第一件事确认自己电脑上有能跑代码的环境并保证能独立运行最低限度的“hello world”。如果这块还不顺先把环境问题解决掉否则后面每一步都会被卡住。第二件事从今天开始记录自己的复杂度意识。不要求立刻掌握复杂分析只要在每次写完一段处理数据的代码后问自己一句“如果数据量变成现在的十倍这段代码还扛得住吗”有这个意识就已经比绝大多数人领先了。第三件事跟着第一篇正文内容走把数组这一个结构彻底吃透。我见过太多人列了宏大的学习计划最后却卡在第一个周末。宏大的计划不如微小的正反馈完成一次与数组相关的动手实践比收藏一百篇学习方法论更有用。按我个人带人的经验凡是能做到“课前预习、课中动手、课后输出”这三步的人即使基础一般三个月后都能达到面试常见题的解题水准。关键不在于天赋和智商而在于是否愿意每天挤出稳定的时间哪怕三十分钟也好把一件事坚持下去。数据结构与算法不是那种一夜速成的领域但它非常诚实你投入的时间会在每一次代码设计和每一场技术面试中以看得见的方式回报你。

相关新闻

OpenCvSharp+USB摄像头录像:从VideoCapture到H264的C#实现指南

OpenCvSharp+USB摄像头录像:从VideoCapture到H264的C#实现指南

简介:面向C#/.NET平台的视频采集与编码开发者,这份资源围绕使用OpenCVSharp库在Windows环境下驱动USB摄像头完成录像,并采用H264标准进行压缩输出的核心需求,提供了一套完整可参考的Visual Studio工程。压缩包包含134个文件&#…

2026/10/17 9:04:30 阅读更多 →
Spring Boot运输管理系统全解析:从架构设计到二次开发实战

Spring Boot运输管理系统全解析:从架构设计到二次开发实战

简介:这是一套基于Java的TMS运输管理系统源码包,面向运输企业信息化建设者和Java后台开发学习者,覆盖订单管理、路线规划、车辆调度、成本控制、货物追踪、报表分析及外部系统接口等典型物流业务模块。压缩包为zip格式,大小74.39M…

2026/10/17 9:04:30 阅读更多 →
HttpAsyncClient中Keep-Alive连接复用原理与排坑指南

HttpAsyncClient中Keep-Alive连接复用原理与排坑指南

Keep-Alive 在 HttpAsyncClient 里的实现,一直是很多同学用异步 HTTP 客户端时最容易绕晕的点。同步的 HttpClient 连接复用好理解,请求结束连接放回池子就完事;但到了异步场景,连接是 NIO 事件驱动的、归还时机是回调里决定的、复…

2026/10/17 9:04:30 阅读更多 →

最新新闻

BiliTools AI总结功能指南:把B站视频变成结构化Markdown摘要

BiliTools AI总结功能指南:把B站视频变成结构化Markdown摘要

BiliTools AI总结功能指南:把B站视频变成结构化Markdown摘要 【免费下载链接】BiliTools 本项目已停止维护。 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools BiliTools 的「AI总结」功能解决一个很具体的问题:一个 45 分钟的教…

2026/10/17 10:26:03 阅读更多 →
CTPN文本检测算法:从片段提议到序列拼接的完整解析

CTPN文本检测算法:从片段提议到序列拼接的完整解析

那阵子在给某票据识别项目做初版方案,遇到一个挺尴尬的情况:通用目标检测模型检测车牌、印章这类紧凑目标时效果还行,一旦面对发票上密密麻麻的印刷体、街景里长短不一的招牌文字,检测框就开始乱跳,要么一个框框住半行…

2026/10/17 10:26:03 阅读更多 →
WinPython 3.9.5.0dot 64 位发行版变更解析:包升级清单与 History 文档生成机制

WinPython 3.9.5.0dot 64 位发行版变更解析:包升级清单与 History 文档生成机制

开发工具构建工具CLI包管理器 【免费下载链接】winpython A free Python-distribution for Windows platform, including prebuilt packages for Scientific Python. 项目地址: https://gitcode.com/gh_mirrors/wi/winpython 点击查看 免费下载 本文以 WinPython 仓…

2026/10/17 10:26:03 阅读更多 →
MCreator 实体模型层受伤红色叠加层(Disable hurt overlay)配置与渲染原理解析

MCreator 实体模型层受伤红色叠加层(Disable hurt overlay)配置与渲染原理解析

低代码代码生成桌面应用游戏开发 【免费下载链接】MCreator MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an in…

2026/10/17 10:26:03 阅读更多 →
Python自动化报表:从模板到邮件推送

Python自动化报表:从模板到邮件推送

一、背景故事:周一早晨的报表噩梦每周一早上九点,某Fab的良率工程师小李都要面对同一件事:做周报。从三个系统里导出数据,在Excel里手动透视、匹配、画图,再复制到PPT模板里,填上评语,最后群发邮…

2026/10/17 10:26:03 阅读更多 →
ResNet+SVM乳腺癌检测实战:特征提取、SVM调参及避坑指南

ResNet+SVM乳腺癌检测实战:特征提取、SVM调参及避坑指南

简介:这份资源面向人工智能与医学影像交叉方向的学习者与开发者,提供一套将ResNet深度残差网络与SVM支持向量机结合用于乳腺癌检测的完整算法实现。资源包共25个文件,包含Python源码、模型权重与训练产物、图像与视频素材、前端页面及说明文档…

2026/10/17 10:25:03 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →