ACM模式输入输出全解析:华为OD机试与算法面试必备技能
1. 从“华为OD机试”说起为什么ACM模式下的输入输出是算法面试的第一道坎最近和不少准备面试的朋友交流尤其是那些瞄准了华为ODOutsourcing Dispatch或其他大厂技术岗位的朋友发现一个挺普遍的现象算法思路明明想对了代码逻辑也没问题但一上机在本地IDE跑得好好的程序提交上去就是各种“运行错误”、“格式错误”或者超时。问题往往就出在最基础也最容易被忽视的环节——ACM模式下的输入输出处理。这可不是危言耸听。华为OD的机试以及很多国内公司的在线编程评测系统采用的都是类似ACM竞赛的判题模式。这种模式和你平时在LeetCode上刷题体验完全不同。LeetCode帮你把输入参数都封装好了你只需要实现一个函数。但在ACM模式里一切从零开始程序需要自己从标准输入比如键盘读取一堆可能格式复杂的数据处理完再把结果严格按照格式输出到标准输出屏幕。系统会拿你的输出和标准答案逐字符比对一个空格、一个换行符错了都算全错。所以别再只埋头研究动态规划和贪心算法了。输入输出IO处理是你算法能力得以展现的“入场券”。票都没拿对门都进不去思路再精妙也是白搭。这篇文章我就结合华为OD机试的常见场景把ACM模式的输入输出掰开了、揉碎了讲清楚涵盖Python和C两种主流语言让你稳稳拿下这关键的“第一分”。2. 核心认知ACM模式与核心函数模式的天壤之别在深入细节之前我们必须从根本上理解这两种模式的差异。这决定了你整个编程和测试的思维方式。2.1 核心函数模式以LeetCode为代表这是我们最熟悉的模式。题目描述类似于“给定一个整数数组nums和一个目标值target请你在该数组中找出和为目标值的那两个整数并返回它们的数组下标。”你的任务就是实现一个函数def twoSum(nums, target): # 你的代码 return [i, j]或者Cclass Solution { public: vectorint twoSum(vectorint nums, int target) { // 你的代码 return {i, j}; } };系统做了什么评测系统会自动生成多组测试数据将nums和target作为参数传入你的函数然后捕获函数的返回值与标准答案对比。输入数据的解析、主函数的调用、结果的收集所有这些“脏活累活”都由系统后台完成。你的关注点100%集中在算法逻辑本身。2.2 ACM模式华为OD/牛客/赛码等主流机试平台题目描述会更“原始”。同样的问题可能描述为“输入包括两行第一行是一系列用空格分隔的整数表示数组nums。第二行是一个整数表示目标值target。请输出和为目标值的两个整数的下标以空格分隔。如果有多组解输出任意一组即可。”你的任务写一个完整的、可以独立运行的程序。# 你需要自己写 main 逻辑 import sys def main(): # 1. 读取输入 line1 sys.stdin.readline().strip() nums list(map(int, line1.split())) target int(sys.stdin.readline().strip()) # 2. 调用算法函数 result twoSum(nums, target) # 3. 格式化输出 print( .join(map(str, result))) if __name__ __main__: main()系统做了什么系统只会准备多组测试数据作为标准输入流喂给你的程序。然后它会捕获你的程序打印到标准输出的所有内容进行字符串比对。你的关注点算法逻辑 输入解析 输出格式化。任何一个环节出错都会导致0分。关键心得很多同学在本地测试时习惯用固定的例子。但在ACM模式中必须考虑输入数据的边界情况和不确定性。比如输入可能有多组测试用例题目会说“输入包含若干行”或“直到文件结束”一行内的数据可能用空格、逗号或其他字符分隔。漏掉这些处理就是最常见的失分点。3. 输入输出实战Python与C的生存指南下面我们针对华为OD机试中高频出现的输入形式给出可直接“抄作业”的代码模板。掌握这些模板能解决95%的输入问题。3.1 Python篇灵活与简洁Python在字符串处理和列表操作上极具优势非常适合快速解决输入输出问题。模板一单行固定数量数据这是最简单的情况。题目明确说明输入只有一行包含固定数量的数据。题目示例“输入三个整数a, b, c计算它们的和。”代码模板import sys def main(): # 读取一行去除首尾空白字符按空格分割并映射为整数 a, b, c map(int, sys.stdin.readline().strip().split()) result a b c print(result) if __name__ __main__: main()sys.stdin.readline(): 从标准输入读取一行包括换行符。.strip(): 去掉这行首尾的空白字符包括换行符\n、空格等。.split(): 默认按任意长度的空白字符空格、制表符等进行分割得到一个字符串列表。map(int, ...): 将列表中的每个字符串转换为整数。模板二单行不定数量数据常见于输入一个数组或列表。题目示例“第一行输入n个整数构成数组nums。”代码模板import sys def main(): # 读取一行整数转换为列表 nums list(map(int, sys.stdin.readline().strip().split())) # 接下来处理 nums # ... if __name__ __main__: main()模板三先读n再读n行数据非常经典的模式。题目示例“第一行是一个整数n表示接下来有n行数据。每行数据是一个字符串。”代码模板import sys def main(): n int(sys.stdin.readline().strip()) # 读取n data_list [] for _ in range(n): line sys.stdin.readline().strip() # 读取每一行 data_list.append(line) # 或者直接处理 # process(line) # 处理 data_list if __name__ __main__: main()模板四多组测试用例直到文件结束(EOF)这是最容易出错的地方题目通常说“输入包含多组测试用例”或“每行包含两个整数直到文件结束”。代码模板使用sys.stdinimport sys def main(): for line in sys.stdin: # 迭代读取每一行直到EOF line line.strip() if not line: # 遇到空行可能跳过视题目要求而定 continue a, b map(int, line.split()) # 处理一组数据 a, b print(a b) # 每组数据输出一个结果 if __name__ __main__: main()for line in sys.stdin:是一个迭代器会持续读取输入非常适合处理未知行数的输入。务必注意在本地IDE测试这种代码时你需要手动触发EOF。在Windows命令行下按CtrlZ然后回车在Mac/Linux下按CtrlD。模板五更复杂的格式化输入如逗号分隔题目示例“输入为一串用逗号分隔的整数。”代码模板import sys def main(): line sys.stdin.readline().strip() # 使用 split(,) 指定分隔符为逗号 nums list(map(int, line.split(,))) # 处理 nums if __name__ __main__: main()Python避坑指南性能陷阱在数据量极大如10万行以上时频繁调用sys.stdin.readline()可能稍慢。此时可以使用sys.stdin.read()一次性读入所有内容再处理但代码会复杂一些。对于机试readline()完全够用。strip()的必要性一定要用.strip()去掉换行符否则最后一个元素可能是5\n转换整数会失败。input()vssys.stdin.readline()在Python中input()内部会调用sys.stdin.readline()并strip()。但input()在遇到EOF时会抛出EOFError而sys.stdin.readline()会返回空字符串。处理多组用例时用sys.stdin更稳健。3.2 C篇速度与掌控C的输入输出流功能强大但在格式化输入上需要更仔细。其优势在于运行效率高在处理海量数据时优势明显。模板一单行固定/不定数量数据使用cin cin 会跳过空白字符空格、换行、制表符直到读取到有效数据非常适合读取已知类型的变量。代码模板#include iostream #include vector using namespace std; int main() { int a, b, c; cin a b c; // 自动跳过空白读取三个整数 // 读取不定长数组先读n再用循环 int n; cin n; vectorint nums(n); for(int i 0; i n; i) { cin nums[i]; } // 处理并输出 cout a b c endl; return 0; }模板二读取整行字符串使用getline当需要读取一行包含空格的字符串时cin 会在空格处停止此时必须用getline。代码模板#include iostream #include string #include sstream // 用于stringstream using namespace std; int main() { string line; // 注意如果之前用过 cin 缓冲区会残留换行符需要先清空 // cin.ignore(); // 忽略掉之前留下的换行符 getline(cin, line); // 读取一整行包括空格 // 如果想从这行字符串中解析出整数可以使用stringstream stringstream ss(line); vectorint nums; int num; while(ss num) { // 从stringstream中读取就像从cin读一样 nums.push_back(num); } // 处理 nums return 0; }这是C输入最大的坑混合使用cin 和getline()时一定要小心缓冲区里的换行符\n。cin n读完整数后换行符还留在输入流里紧接着的getline()会立刻读到这个空行。解决方法是在getline前加一句cin.ignore();。模板三多组测试用例直到EOF代码模板使用while(cin a)#include iostream using namespace std; int main() { int a, b; // 当cin尝试读取数据但遇到文件结束(EOF)时条件会变为false while(cin a b) { // 处理一组数据 a, b cout a b endl; } return 0; }这是最简洁优雅的方式。cin a本身会返回流对象的状态如果读取成功未遇到EOF或类型错误则条件为真。模板四追求极致速度关闭同步在数据量巨大的竞赛中可以关闭C标准流和C标准流的同步并解除cin/cout与scanf/printf的绑定能大幅提升IO速度。代码模板#include iostream using namespace std; int main() { // 关闭同步加速IO ios::sync_with_stdio(false); // 解除 cin 和 cout 的绑定进一步加速但此时不能混用cin/scanf或cout/printf cin.tie(nullptr); cout.tie(nullptr); int n; cin n; // ... 快速读写操作 // 注意此后不要使用 scanf, printf, getchar等C风格IO return 0; }C避坑指南cin 与getline()的混用如前所述务必记得cin.ignore()或者统一使用一种风格。输出格式cout endl;会输出换行并刷新输出缓冲区在频繁输出时可能影响性能。可以改用cout “\n”;。但在机试中这点性能差异通常可忽略用endl更清晰。vector的预分配如果已知数据规模n使用vectorint nums(n);然后通过cin nums[i];赋值比用push_back在循环里添加要快一点也避免了多次扩容的开销。4. 华为OD机试真题场景拆解与应对策略光有模板不够我们结合具体场景看看如何灵活运用。4.1 场景一简单计算题AB Problem 变种这是最简单的入门题但可能包装成各种形式。题目描述计算一系列整数的和/积/最大值等。输入可能有多组每组占一行每行两个整数。输入示例1 2 3 4 5 6Python应对直接使用模板四EOF循环。import sys for line in sys.stdin: a, b map(int, line.strip().split()) print(a b)C应对直接使用模板三while(cin)。#include iostream using namespace std; int main() { int a, b; while(cin a b) { cout a b endl; } return 0; }4.2 场景二数组/列表处理题这是算法题的主流输入格式多变。题目描述第一行一个整数n第二行n个用空格分隔的整数代表数组。之后可能还有一行一个整数k代表目标值等。输入示例5 1 3 5 7 9 10Python应对组合使用模板二和模板一。import sys n int(sys.stdin.readline().strip()) nums list(map(int, sys.stdin.readline().strip().split())) target int(sys.stdin.readline().strip()) # 接下来是 twoSum 等算法逻辑C应对使用模板一。#include iostream #include vector using namespace std; int main() { int n; cin n; vectorint nums(n); for(int i0; in; i) cin nums[i]; int target; cin target; // 算法逻辑 return 0; }4.3 场景三字符串处理题可能涉及带空格的句子、特定分隔符。题目描述输入一行字符串可能包含空格统计单词数或进行其他操作。输入示例Hello world from Huawei ODPython应对直接读取整行用split()分割。line sys.stdin.readline().strip() # 注意如果字符串开头结尾可能有空格题目要求保留则不能用strip words line.split() # 默认按空白字符分割 print(len(words))C应对必须使用getline。string line; getline(cin, line); // 读取整行 stringstream ss(line); int count 0; string word; while(ss word) count; // 利用stringstream分割单词 cout count endl;4.4 场景四复杂结构题如二叉树题目可能以前序遍历的形式给出二叉树用特定值如-1表示空节点。题目描述输入一行为二叉树的前序遍历序列空节点用-1表示。输入示例1 2 -1 -1 3 4 -1 -1 5 -1 -1应对策略这类题目输入本身是简单的单行不定长数据。难点在于如何根据这个输入序列重建二叉树。这考验的是你对数据结构本身的理解和编码能力。输入部分直接用模板二读取成列表即可重建二叉树的递归函数才是核心。def build_tree(nums, index): # index是当前在nums中读取的位置 if index[0] len(nums) or nums[index[0]] -1: index[0] 1 return None root TreeNode(nums[index[0]]) index[0] 1 root.left build_tree(nums, index) root.right build_tree(nums, index) return root # 主函数中读取输入 nums list(map(int, sys.stdin.readline().strip().split())) idx [0] # 使用可变对象来传递索引 root build_tree(nums, idx)5. 调试技巧与常见“坑点”实录即便掌握了模板实战中还是会踩坑。下面是我和朋友们血泪教训总结出来的排查清单。5.1 本地测试如何模拟多组用例EOF这是新手最大的困惑。程序写好了怎么测试方法一推荐使用文件重定向创建一个文本文件input.txt里面写好你的测试数据。在命令行运行你的程序python your_code.py input.txt(Python) 或./your_cpp_program input.txt(C编译后)。程序会自动从input.txt读取输入就像从键盘输入一样到文件末尾自动触发EOF。方法二手动输入触发EOF在命令行直接运行程序输入数据最后手动发送EOF信号。Windows: 在新的一行先按CtrlZ再按Enter。Mac/Linux: 在新的一行按CtrlD。5.2 为什么我的程序总是“输出超限”或“格式错误”输出超限99%是因为你的程序陷入了死循环或者在循环里打印了太多调试信息忘记删除。务必检查循环终止条件。格式错误多余的空格或换行题目要求输出“1 2 3”你输出成了“1 2 3 ”末尾多空格或“1 2 3\n\n”多换行。使用‘ ‘.join(map(str, list))或循环输出时注意最后一个元素后不加空格。大小写错误要求输出“YES”你输出了“Yes”。标点错误要求输出“1,2,3”你输出了“1 2 3”。黄金法则完全按照题目要求的字面格式输出一个字符都不要差。最好把样例输入输出复制下来对照着看。5.3 如何应对未知行数的输入这是区分是否理解ACM模式的关键。如果题目描述模糊只说“输入若干行”或“输入多组数据”一律按照“读取到文件结束EOF”来处理。使用Python的for line in sys.stdin或C的while(cin …)是最安全的策略。5.4 性能优化小贴士虽然机试对时间要求通常不严但好习惯能避免意外。Python在数据量极大时考虑使用sys.stdin.buffer.read()一次性读取二进制数据然后解码分割速度最快。列表推导式通常比普通for循环快。频繁的字符串拼接使用‘ ‘.join()而不是。C使用ios::sync_with_stdio(false); cin.tie(nullptr);关闭同步。使用‘\n‘代替endl。在知道规模的情况下为vector预分配内存。6. 备考策略与心态调整最后分享几点关于华为OD机试本身的备考建议。1. 题库与真题网上流传的“华为OD机试题库”有一定参考价值但不要指望原题。它的意义在于让你熟悉题型、难度和输入输出格式。把重点放在掌握常见算法排序、查找、DFS/BFS、动态规划、滑动窗口、哈希表和数据结构数组、链表、字符串、栈、队列、二叉树上。2. 环境熟悉在考前一定要去牛客、赛码等平台的ACM模式题库练习。熟悉在线编程环境包括如何调试、如何查看错误信息。华为OD通常使用自己的考试系统但模式是相通的。3. 时间分配机试一般2-3道题时长2小时。简单题第一题务必在20分钟内稳稳拿下这靠的就是扎实的输入输出和基础编码能力。留出足够时间给后面的中等或难题。4. 调试心态如果提交错了不要慌。首先检查输入输出格式这是最简单的错误。然后检查边界条件数组为空、n0、数值极大/极小、字符串为空等。最后再审视算法逻辑。养成“先通过样例再考虑边界”的调试习惯。说到底ACM模式的输入输出就像开车前系安全带或者像写作文先审题。它不构成核心挑战但决定了你有没有资格展示真正的实力。花上几个小时把上面这些模板练到肌肉记忆在机试中你就能为自己赢得宝贵的、心无旁骛思考算法的时间。这份从容就是迈向成功的第一步。

相关新闻

lua-languages高级技巧:静态类型检查与函数式编程实战

lua-languages高级技巧:静态类型检查与函数式编程实战

lua-languages高级技巧:静态类型检查与函数式编程实战 【免费下载链接】lua-languages Languages that compile to Lua 项目地址: https://gitcode.com/gh_mirrors/lu/lua-languages 在Lua生态中,lua-languages项目集合了多种可编译为Lua的编程语…

2026/10/6 12:35:01 阅读更多 →
OpenClaw Web控制面板安装与使用指南

OpenClaw Web控制面板安装与使用指南

1. OpenClaw控制面板的必要性 第一次接触OpenClaw(Clawdbot)时,我和大多数开发者一样被它的命令行界面劝退。那些复杂的参数组合和晦涩的错误提示,让简单的操作变得异常痛苦。直到发现它的Web控制面板,整个使用体验才发…

2026/10/13 0:12:45 阅读更多 →
Unity-UIGradient终极指南:从原理到实战的完整解析

Unity-UIGradient终极指南:从原理到实战的完整解析

Unity-UIGradient终极指南:从原理到实战的完整解析 【免费下载链接】Unity-UIGradient A UI gradient effect script for Unity 项目地址: https://gitcode.com/gh_mirrors/un/Unity-UIGradient 在Unity游戏开发中,UI视觉效果的重要性不言而喻。传…

2026/9/21 11:00:34 阅读更多 →

最新新闻

Spring Security实战:认证授权、过滤器链与SpringBoot集成全解析

Spring Security实战:认证授权、过滤器链与SpringBoot集成全解析

Spring Security这个名字,凡是用Java做过后端Web项目的朋友,基本都会在某一天撞上它。我印象很深,第一次接手一个带有登录权限的旧项目时,打开配置类看到一长串security的配置,先是懵了,再是改一个小需求就…

2026/10/15 0:29:25 阅读更多 →
Qt QSS属性选择器组合用法:多条件精准匹配与动态主题化实践

Qt QSS属性选择器组合用法:多条件精准匹配与动态主题化实践

做过几个上了量的 Qt 项目之后,最让人头疼的往往不是业务逻辑,而是界面状态怎么管。按钮要分主次、标签要分轻重、卡片要根据不同业务状态变色,如果这些全靠 if-else 挂 setStyleSheet,代码库迟早变成一团乱麻。QSS 里的属性选择器…

2026/10/15 0:29:25 阅读更多 →
OpenCL加速点云压缩:八叉树与属性预测的GPU并行实践

OpenCL加速点云压缩:八叉树与属性预测的GPU并行实践

1. 点云数据为什么需要压缩:从传感器输出到存储瓶颈点云这东西,第一次接触的人往往会被它的数据量吓一跳。一台中端激光雷达单帧就能吐出几十万个三维坐标点,如果按每秒10帧的采集频率持续工作,一分钟就是几千万个点。每个点除了X…

2026/10/15 0:29:25 阅读更多 →
TreeMap源码深度解析:红黑树在Java中的工业级实践

TreeMap源码深度解析:红黑树在Java中的工业级实践

1. 为什么TreeMap不是“带排序的HashMap”,而是一个被严重低估的平衡树实践课很多人第一次接触TreeMap,是在面试题里看到“HashMap和TreeMap的区别”——然后脱口而出:“TreeMap是有序的,HashMap是无序的”。这话没错,…

2026/10/15 0:29:25 阅读更多 →
CleanCode标准融入AI编程:“生成即规范”的代码生成器实践指南

CleanCode标准融入AI编程:“生成即规范”的代码生成器实践指南

我做了七年多一线开发,大半时间都在跟两类东西搏斗:一类是屎山一样的存量代码,另一类是人手不够时咬牙快速堆出来的新功能。后来开始认真用AI编程辅助干活,发现一个很尴尬的事实——AI确实能快,但生成的代码风格千奇百…

2026/10/15 0:28:21 阅读更多 →
ibm-watson 4.2.1源码包安装、语音识别调用与迁移避坑指南

ibm-watson 4.2.1源码包安装、语音识别调用与迁移避坑指南

简介:IBM Watson 4.2.1 的 Python SDK 压缩包,面向需要在 Python 项目中快速接入 Watson 人工智能服务的开发者,覆盖自然语言理解、语音转写、语音合成、机器翻译、智能对话等常用功能。压缩包内共 59 个文件,以 46 个 Python 源文…

2026/10/15 0:28:21 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →