PAT L2-033 简单计算器:双栈模拟与运算顺序陷阱

1. 题目到底在说什么:别被“简单”两个字骗了

PAT团体程序设计天梯赛的L2级别题目,向来是“分数不高但坑不少”的重灾区。L2-033这道“简单计算器”,题面看起来短得离谱:给定两个栈,一个存数字,一个存运算符,你只需要不断从数字栈取两个数、从运算符栈取一个运算符,做一次运算后把结果压回数字栈,直到运算符栈空了,最后数字栈里剩下的那个数就是答案。

但就这么一个“照着做”的题,我在实际带队训练和模拟赛里见过不少选手翻车。有人读题读漏了条件,有人压根没意识到运算顺序是从栈顶往下取的,还有人被“ERROR”输出的时机卡住。这道题在GPLT里拿了25分满分档位,说明它绝不是白送分的。

先说人话解释一下题目场景:你面前有两个栈,像两个叠起来的碟子。数字碟子里从底到顶放着若干整数,运算符碟子里从底到顶放着若干四则运算符。每次操作都从两个碟子顶部各取东西:从数字碟子顶取两个数字,从运算符碟子顶取一个符号,算完得到一个结果,重新放回数字碟子顶。反复这样,运算符碟子空了,数字碟子里只剩一个数,输出它。中间任何一次操作发现问题,输出ERROR。

需要注意,这个“每次取两个数”是有先后顺序的。假设数字栈顶先是a,然后是b(也就是说b在a下面),那你实际要算的是“b op a”,不是“a op b”。这个顺序在减法和除法里非常重要,下面我会专门讲。

2. 考点定位:为什么说这道题考的是“栈的理解”而不是“计算器”

2.1 题面背后的真实考点

天梯赛把这题放到L2,说明它至少需要你具备两个能力:第一,熟练使用栈这个数据结构,包括栈的各种操作和栈为空时的判断;第二,能够处理“模拟过程”中的异常分支,而不是只会写顺拐逻辑。

这题本质上是指令模拟。每一步做什么,题目已经规定好了,不需要你自己设计算法,连后缀表达式、中缀转后缀都不用。你只需要严格按规则推进。但恰恰是这种“不用动脑”的题,最容易暴露基本功差距。

有一种常见的错误思路是把问题想复杂:有人看到“计算器”三个字就往上写表达式求值,把中缀转后缀、运算符优先级全部实现一遍。这样做当然也能得到结果,但在赛场上浪费时间,而且容易在细节上出错。还有人试图用队列来存数字,觉得“取两个数字”应该从头取。但题目白纸黑字写的是栈,必须从栈顶取。

2.2 为什么“模拟”才是正解

我们不妨推演一下,如果用表达式解析的思路会发生什么:你需要先构造一个完整的表达式字符串,再递归下降解析,还要处理运算符优先级、括号(虽然这题没有括号)等一系列问题。代码量轻松翻倍。而这题根本不需要优先级,因为运算符的执行顺序已经被栈的弹出顺序固定死了。

打个生活化的比方:这就好比你去食堂打饭,窗口规则是“每次从餐盘堆最上面拿一个盘子,再从菜盆里舀一勺菜”。你非要把整堆盘子先全部翻出来排列好,再研究哪勺菜该配哪个盘子,这不是不能做,而是没必要。规则已经足够简单直接,照着做就是最优解。

所以这题的第一个得分关键:认清题目考察的是模拟,不是表达式求值。没有优先级,没有括号,只需要机械地执行N-1次运算。

3. 核心实现:双栈模拟的完整推导

3.1 数据结构和读入逻辑

整个程序的骨架非常清晰,两个栈,一个存数字,一个存字符。读入时先读n,接下来一行是n个整数(按从底到顶的顺序给出),再接下来一行是n-1个运算符(同样按从底到顶的顺序给出)。

这里有一个特别容易搞错的理解:题目输入给你的顺序,就是栈从底到顶的顺序。比如说输入数字是“1 2 3 4”,压栈后栈顶是4,不是1。很多人读入后直接用数组下标操作,结果用的是数组顺序而不是栈顺序,就会导致计算错位。

正确做法是:

#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; stack<int> nums; stack<char> ops; for (int i = 0; i < n; i++) { int x; cin >> x; nums.push(x); } for (int i = 0; i < n - 1; i++) { char c; cin >> c; ops.push(c); } // 模拟过程 while (!ops.empty()) { // 取数字栈顶两个数 int a = nums.top(); nums.pop(); int b = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); // 判断异常 if (op == '/' && a == 0) { cout << "ERROR: " << b << "/0" << endl; return 0; } // 运算 int result; if (op == '+') result = b + a; else if (op == '-') result = b - a; else if (op == '*') result = b * a; else result = b / a; nums.push(result); } cout << nums.top() << endl; return 0; }

有同学可能会问:为什么临时变量用a和b,结果却用b op a?因为刚才说了,第一个取出来的是栈顶元素a,第二个取出来的是新栈顶b。在栈中b的位置在a的下面,所以先入栈的是b,后入栈的是a。正常的从左到右表达式应当是“b op a”。

3.2 运算过程的逐步推演

拿题目样例来跑一遍。假设n=5,数字序列是1 2 3 4 5,运算符序列是+ - * /。那么初始状态:

  • 数字栈从底到顶:1 2 3 4 5,栈顶是5
  • 运算符栈从底到顶:+ - * /,栈顶是/

第一轮:

  • 弹出数字5作为a,弹出4作为b,弹出运算符/作为op
  • 判断:a=5,非零,正常
  • 计算 b / a = 4 / 5 = 0(整数除法)
  • 结果0压回数字栈,此时数字栈从底到顶:1 2 3 0

第二轮:

  • 弹出0作为a,弹出3作为b,弹出运算符*作为op
  • 计算 b * a = 3 * 0 = 0
  • 结果0压回,数字栈:1 2 0

第三轮:

  • 弹出0作为a,弹出2作为b,弹出运算符-作为op
  • 计算 b - a = 2 - 0 = 2
  • 结果2压回,数字栈:1 2

第四轮:

  • 弹出2作为a,弹出1作为b,弹出运算符+作为op
  • 计算 b + a = 1 + 2 = 3
  • 结果3压回,数字栈:3

最后输出3。整个过程刚好做n-1次运算,最后一次运算后数字栈里只有一个元素。

3.3 为什么要把除零判断放在运算前

题目明确规定:如果除数为0,输出“ERROR: X/0”,其中X是当前的被除数。这个X是哪个数?要注意,在我们的取数顺序里,先弹出的是a,也就是除数。比如上一节样例第一步,a=5,做的是4/5,被除数是b=4。如果是除零,那被除数就是b。所以输出的是 b/0,不是 a/0。

这个细节在赛场上特别容易写反。你想想,大多数人判断除零时会自然写:

if (a == 0 || b == 0)

这就错了。只有当除数(后弹出的那个)为0时才算错,被除数为0完全没有问题。0除以任何非零数都合法,结果是0。所以判断条件只能是除数为0,也就是op为'/'且a为0。

还要注意一个处理时机:一旦发现除零,应当立刻输出ERROR并结束程序,不需要再继续读入或者继续计算。因为题目要求输出ERROR后直接终止,后面即使还有未处理的数据也不用管。我在训练时见过一种做法是设flag标记,继续跑完模拟再统一输出,这其实不符合题意。

4. 边界条件全梳理:那些让满分变零分的隐藏陷阱

4.1 运算过程中数字栈只剩一个数的情况

模拟循环的条件是运算符栈非空,而不是数字栈非空。判断循环是否结束,唯一标准是运算符栈里还有没有符号。当运算符栈空时,数字栈必然是1个元素,直接输出即可。

但在循环内部,取两个数之前要不要判断数字栈元素个数?理论上不需要,因为题目保证初始数字个数n,运算符个数n-1,每次消耗2个数产生1个数,净减少1个。运行k次循环后数字栈元素数为n-k,而循环次数最多n-1,所以第n-1次循环开始时数字栈至少有2个元素。

但实际写代码时,稳妥起见可以在取数前加一个判断:

if (nums.size() < 2) break;

有些选手不写这个判断,程序也能跑对,因为数据是合规的。但加上这个判断可以让你的程序更鲁棒,万一读入数据时出现了空行、末尾符号缺失等意外,不至于让top()操作崩溃。

4.2 输入顺序和出栈顺序混淆

这是很多人丢分最主要的原因。题目输入的是一串数字,比如“5 4 3 2 1”,这到底意味着栈底是5还是栈顶是5?题面如果没有明确说明,那你应该按常规栈的行为来理解:按照输入顺序依次push,那么最后输入的数字就在栈顶。

比如输入“1 2 3 4 5”,第一个读入的1是栈底,最后读入的5是栈顶。出栈时先出5。运算符同理,第一个读入的运算符在栈底,最后读入的在栈顶。出栈时先出最后一个运算符。

这就意味着,你看到的输入顺序和实际计算顺序是反的。如果样例里数字是“1 2 3 4 5”,实际先参与运算的是5和4,而不是1和2。很多同学手算样例时按顺序从头算,算完发现对不上,就一头雾水。

[\text{这一点真的得反复强调,因为哪怕你代码写对了,手算样例时思路错了也会影响你排查错误。}]

4.3 整数除法的负数舍入方向

题目要求整数运算,除法结果直接取整。C++里整数除法是向零取整,也就是说-3/2的结果是-1,而不是-2。这跟Python的整除不一样,Python的//是向下取整。

这题里需要特别注意吗?需要,因为题目没有明确说除法结果是什么取整方式。但在PAT环境下,C++的整数除法行为就是向零取整,你直接用int做除法就是正确的。

如果你用Python写这题,要小心//的取整方式和C++不同。负数除法时Python会得到-2,而C++得到-1。所以如果要用Python,最好是int(b / a),而不是b // a。

另外,题目保证中间结果不会超过int范围吗?不一定。虽然n的数据范围不大,但乘法可能产生较大结果。稳妥起见可以用long long存储。我看到不少用int的选手也没出问题,因为题目的数据生成通常不会刻意构造溢出;但竞赛嘛,加一个long long又不需要多少成本,没必要赌。

4.4 输出格式的严格性

题目要求ERROR的输出格式是“ERROR: X/0”,中间有一个英文冒号和一个空格。有些同学写成了“ERROR:X/0”或者“Error: X/0”,这在PAT评测里都是错的。PAT的判题机对输出字符串是严格匹配的,多一个空格少一个冒号都不行。

最后正常结果的输出只需一个整数,不要画蛇添足输出多余的空格或换行以外的字符。用cout输出整数默认不带多余空格,完全符合要求。

5. 扩展思考:从L2-033能学到什么更一般的东西

5.1 这类“模拟栈计算”题的通用套路

L2-033不是天梯赛里唯一一道栈模拟题。还有类似题目会考察括号匹配、后缀表达式求值、表达式化简等。这些题目的共性是什么?都是“给定一种数据结构,按某种规则反复操作”。

处理这类题目有一个固定的分析顺序:

  • 第一步,明确数据结构的进出顺序。栈就是LIFO,队列就是FIFO,先搞清楚哪个元素先被取出来。
  • 第二步,明确每一步操作的输入输出。每一步消耗什么、产生什么,必须写清楚。
  • 第三步,找到循环不变量。比如本题中,每一轮循环后“数字栈元素个数减1,运算符栈元素个数减1”,这就是不变量。用它判断循环是否可以结束。
  • 第四步,把所有异常情况列出来。本题的异常只有除零,但其他类似题可能有表达式非法、括号不匹配、栈空取数等多种异常,需要逐一定义输出。

这四步做完,代码基本不会出现大的逻辑漏洞。

5.2 和“后缀表达式求值”的关系

很多人学栈的时候都做过后缀表达式求值,那题的经典做法是:遇到数字压栈,遇到运算符弹出两个数,计算结果压回。L2-033的思路和后缀表达式求值本质上是同一个东西,区别只在于L2-033的运算符不是从输入串里读取,而是预先放在另一个栈里。

理解了这一点,你就会发现L2-033其实是“后缀表达式求值”的变形。如果你已经掌握了后缀表达式求值,这题只需要转换一下输入处理方式即可。

反过来说,如果你能把这题吃透,再做真正的后缀表达式求值也会顺畅很多。因为它们的“弹两个数、算一个结果、压回结果”这个核心逻辑完全一致。

5.3 队内训练时的常见错误模式

我在带训练队的时候,让队员限时15分钟写这道题。大部分人的第一版代码能通过样例,但提交时会在某个边界数据上挂掉。我把常见错误整理成了一张对照表,方便自查。

错误类型具体表现正确做法
顺序错误计算时用了a op b而不是b op a弹出顺序决定运算顺序,先弹的是右操作数
除零误判判断a==0或b==0都输出ERROR只有除数(后弹出的那个)为0才算错
输出格式少了空格或冒号严格匹配ERROR: X/0
循环条件用数字栈非空作为循环条件用运算符栈非空作为循环条件
取整方式Python里用//导致负数除法错误C++直接整数除法,Python用int(b/a)

这些错误不是不会写代码,而是对“栈的操作顺序”没有形成条件反射。一旦出错,不要急着改代码,先回到题面,把每一步的栈状态画出来,再对照代码逐步检查。

5.4 赛场上如何快速验证答案

写完之后,除了跑题目给的标准样例,我强烈建议自己构造两组数据验证:

第一组是除法顺序验证。比如输入:

3 8 4 2 /

按题意,数字栈从底到顶是8、4、2,运算符只有/。先弹2作为a,弹4作为b,计算4/2=2,压回。此时数字栈是8、2,运算符栈空。输出2。如果你算出的是8/2=4,说明顺序搞反了。

第二组是除零验证。比如输入:

3 5 6 0 /

数字栈从底到顶是5、6、0,先弹0作为a,弹6作为b,判断除数为0,输出“ERROR: 6/0”。如果你输出的是“ERROR: 5/0”或者“ERROR: 0/0”,说明取数或输出逻辑有误。

这两组数据手算起来很快,但足够覆盖这个题的核心陷阱。赛场上时间再紧,也值得花30秒做一下自测。

6. 最终代码和一些小细节

最后给出一个更完整的参考实现,里面加了long long、栈大小保护和一些注释,方便直接对照使用。

#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; stack<long long> nums; stack<char> ops; for (int i = 0; i < n; ++i) { long long x; cin >> x; nums.push(x); } for (int i = 0; i < n - 1; ++i) { char op; cin >> op; ops.push(op); } while (!ops.empty()) { // 安全保护,防止栈元素不足时访问未定义行为 if (nums.size() < 2) { break; } long long a = nums.top(); nums.pop(); long long b = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); if (op == '/' && a == 0) { cout << "ERROR: " << b << "/0" << "\n"; return 0; } long long result = 0; if (op == '+') { result = b + a; } else if (op == '-') { result = b - a; } else if (op == '*') { result = b * a; } else { result = b / a; } nums.push(result); } cout << nums.top() << "\n"; return 0; }

几个小细节说明一下:

  • ios::sync_with_stdio(false)和cin.tie(nullptr)是竞赛标配,加快输入速度,避免大数据量时超时。这道题数据量不大,写不写都行,但养成习惯没坏处。
  • 用long long是稳妥方案,尤其是乘法累积时,int有可能越界。
  • 除零判断务必放在计算之前,否则你会先用0做一次除法,轻则产生inf,重则程序崩溃。
  • 输出用"\n"而不是endl,因为endl会刷新缓冲区,速度更慢。虽然这题无所谓,但好习惯要养成。

单从这一个题来看,代码量不到40行,但里面蕴含的考点覆盖了栈操作、模拟流程、异常处理、格式输出等多个维度。天梯赛L2的题目往往就是这样:每个单独考点都很基础,但组合在一起,就能筛掉一批基本功不扎实的选手。把这道题真正吃透,不只是为了一题25分,更重要的是建立对栈模拟这一类问题的肌肉记忆。后续再做L2里那些表达式相关、括号处理的题目时,你会明显感觉顺畅不少。

相关新闻

PyTorch深度学习框架选型与工程实践:从动态图到模型部署

PyTorch深度学习框架选型与工程实践:从动态图到模型部署

这几年如果你问我深度学习框架该怎么选&#xff0c;我的答案始终是同一个——PyTorch。从最初在学术圈流行&#xff0c;到现在工业界大规模落地&#xff0c;PyTorch几乎成了深度学习的默认语言。无论你是刚入门的新手&#xff0c;准备复现论文的学生&#xff0c;还是要在生产环…

2026/10/20 16:16:42 阅读更多 →
MATLAB三维极坐标绘图:天线方向图绘制与避坑指南

MATLAB三维极坐标绘图:天线方向图绘制与避坑指南

简介&#xff1a;面向MATLAB用户与天线设计人员&#xff0c;这份压缩包演示了如何在MATLAB中实现三维极坐标绘图。由于surf、mesh等原生函数基于笛卡尔坐标&#xff0c;难以直接绘制三维方向图&#xff0c;资源以天线三维方向图为例&#xff0c;给出先由极坐标转换至直角坐标、…

2026/10/20 16:16:42 阅读更多 →
阿里云 Wan2.1 AI视频生成指南:零基础提示词与参数实战

阿里云 Wan2.1 AI视频生成指南:零基础提示词与参数实战

最近不少朋友问我&#xff0c;AI 视频生成到底能不能落地用。我的答案一直是&#xff1a;能&#xff0c;但要看你会不会用。今天这篇教程要讲的就是阿里云 Wan 2.1 这个文本生成视频工具&#xff0c;我把它当主力工具用了很长一段时间&#xff0c;从最早的测试版一路用到 2.1 版…

2026/10/20 16:16:42 阅读更多 →

最新新闻

Agentic Harness Workflow:从能跑通代码到可交付工程的AI编程框架

Agentic Harness Workflow:从能跑通代码到可交付工程的AI编程框架

1. 为什么"能跑通的代码"和"能交付的工程"之间隔着一道鸿沟 如果你最近半年深度用过任何一款 AI 编程助手&#xff0c;大概率经历过这样的场景&#xff1a;你让它写一个功能&#xff0c;它三下五除二吐出一大段代码&#xff0c;你复制粘贴进去&#xff0c;…

2026/10/20 17:04:26 阅读更多 →
Postman接口关联实战:从登录Token到下单的自动化流程

Postman接口关联实战:从登录Token到下单的自动化流程

某B2C在线商城的API接口文档里&#xff0c;最经典的一条业务就是“登录-选择商品加入购物车-下单”。我拿到这个需求的第一反应是&#xff1a;请求参数倒是不难&#xff0c;难在这些接口之间要传一堆动态数据&#xff0c;登录返回token、商品列表返回productId、购物车返回购物…

2026/10/20 17:04:26 阅读更多 →
Agentic Harness Workflow:用状态机+Agent工程化框架驾驭AI编码

Agentic Harness Workflow:用状态机+Agent工程化框架驾驭AI编码

1. 为什么“让AI写代码”这件事需要一套工程化框架 1.1 从“对话式写代码”到“流程化跑任务”的认知转变 过去一年多&#xff0c;我身边不少开发者对 AI Coding 的态度经历了三个阶段&#xff1a;最开始是好奇&#xff0c;拿它写个正则、补个单元测试&#xff1b;然后是依赖&…

2026/10/20 17:04:26 阅读更多 →
InstallShield中附属MSI的安装卸载实战与调试

InstallShield中附属MSI的安装卸载实战与调试

前两天帮人看一个安装包的诡异问题&#xff1a;主程序明明是装成功了&#xff0c;但被一起带上的那个MSI组件死活装不上&#xff0c;卸载的时候还赖在系统里不走。这个场景搞Windows安装包的朋友应该不陌生——主程序用InstallShield打成一个安装包&#xff0c;安装时还要顺带把…

2026/10/20 17:04:26 阅读更多 →
HUSB351快充芯片:小体积PD协议芯片的工程落地逻辑

HUSB351快充芯片:小体积PD协议芯片的工程落地逻辑

1. 从“机乐堂”供应链变动看快充芯片选型的底层逻辑最近在整理一批快充配件的BOM清单时&#xff0c;注意到一个细节&#xff1a;某款标称30W PD快充的迷你插线板&#xff0c;其协议识别模块的丝印从常见的“FP6606”悄然换成了“HUSB351”。进一步交叉查证发现&#xff0c;该产…

2026/10/20 17:04:26 阅读更多 →
MVMD联合小波阈值去噪:多通道非平稳信号MATLAB实战

MVMD联合小波阈值去噪:多通道非平稳信号MATLAB实战

简介&#xff1a;这份资源面向信号处理、故障诊断与振动监测方向的学习者和研究人员&#xff0c;提供一套基于MATLAB的完整联合去噪方案&#xff0c;用于从含噪多通道信号中恢复原始信号。核心流程涵盖MVMD多元变分模态分解、基于相关系数的有效模态筛选、小波阈值去噪、模态重…

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

日新闻

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 阅读更多 →