中心对称数这个题目我第一次看到的时候以为是在考字符串回文读完题才发现完全不是一回事。它考的是数字在特定字体下旋转180度之后是否还是原来的数本质上是字符映射加构造逻辑的组合题。这类题在丙组T2的位置出现难度控制得比较克制但坑点密度不低尤其是前导零和中间位处理这两块每年都有不少选手在这里翻车。我后来带过几批刚学C的学生做这道题发现大家卡住的地方高度集中所以干脆把这道题从头到尾拆一遍把思路、实现、调试和避坑都写清楚。这篇文章适合正在准备算法竞赛初阶组别的同学也适合想拿一道具体题目来练手字符串处理和构造思维的开发者。我会从题目本质讲起把为什么这样设计、每一步怎么想、代码怎么写、错了怎么查全部摊开来说。读完你应该能独立复现这道题并且能把类似的构造类题目迁移过去。1. 题目本质与核心思路拆解1.1 中心对称数到底在考什么先把概念说清楚。中心对称数指的是这样一个数字把它写出来然后整体旋转180度得到的还是同一个数。注意这里的关键词是“旋转”而不是“翻转”或“镜像”。旋转180度意味着每一位数字都要变成另一个特定的数字同时整个数字的顺序要反过来。哪些数字旋转180度之后还是合法数字只有五个0变01变12变25变58变8。另外6和9互相转换6旋转后变99旋转后变6。其余数字3、4、7旋转之后就不是合法数字了所以任何包含3、4、7的数都不可能是中心对称数。这个映射关系是整道题的地基。你可以把它记成一张表原数字旋转180度后00112255698896题目通常的问法是给定一个长度n问有多少个长度为n的中心对称数或者按某种顺序输出这些数。丙组T2的常见设定是统计个数或者构造输出具体形式可能因场次略有差异但核心逻辑一致。为什么这个题放在T2因为它不需要复杂的数据结构也不需要动态规划纯粹是数学观察加循环构造。但它对细节的要求很高稍不注意就会在边界上出错。这正是T2这个位置的典型特征思路不难但实现要稳。1.2 为什么用构造法而不是枚举法最直接的想法是枚举所有n位数逐个判断是不是中心对称数。n位数从10^(n-1)到10^n-1n稍微大一点这个范围就爆炸了。比如n10要枚举九十亿个数显然不现实。所以必须换思路。正确的做法是构造一个中心对称数由它的前半部分完全决定。因为旋转180度之后顺序反转所以后半部分其实是前半部分旋转后的逆序。换句话说只要确定了前一半的数字后一半就唯一确定了。这里要分奇偶讨论。设长度为n如果n是偶数前n/2位可以自由选择每一位从允许的集合里选后n/2位由前n/2位旋转并逆序得到。如果n是奇数中间那一位必须是自己旋转后还是自己的数字也就是只能从0、1、2、5、8里选6和9不行因为6旋转后是9不是自己。前(n-1)/2位自由选择后(n-1)/2位由前面旋转逆序得到。这个构造思路把问题从“枚举所有数”降到了“枚举一半的数”复杂度从10^n降到5^(n/2)左右完全可控。1.3 前导零这个坑为什么必须单独处理构造的时候有一个隐蔽的陷阱第一位不能是0。因为如果第一位是0那这个“n位数”实际上不足n位不符合题目对长度的要求。但这里有个微妙之处。对于n1的情况数字0本身是合法的中心对称数它就是一个一位数。所以n1时0要算进去。而n1时第一位不能是0。很多人的第一版代码会忘记这个区分导致n1时漏掉0或者n1时多算了以0开头的构造。这个点我在带学生的时候见过太多次几乎每三个人里就有一个在这里出错。处理方式很直接如果n1特殊处理答案里包含0、1、2、5、8这五个注意6和9单独一位不行因为旋转后变成对方不是自己。如果n1第一位从1、2、5、6、8、9里选排除0其余自由位从0、1、2、5、6、8、9里选。注意中间位n为奇数时的候选集合是0、1、2、5、8不含6和9。这个集合和自由位的集合不一样写代码时要用两个不同的候选数组别图省事共用一个。2. 核心细节解析与实现要点2.1 映射表的两种组织方式映射关系在代码里有两种常见组织方式各有适用场景。第一种是用数组做直接映射下标是原数字值是旋转后的数字int mp[10] {0, 1, 2, -1, -1, 5, 9, -1, 8, 6};这里-1表示该数字旋转后不合法。这种写法查询是O(1)很直接。但要注意初始化时把3、4、7对应的位置设成-1别漏了。第二种是用两个候选数组一个给自由位用一个给中间位用int free_digits[7] {0, 1, 2, 5, 6, 8, 9}; int mid_digits[5] {0, 1, 2, 5, 8};这种写法在构造时更顺手因为直接遍历候选集合就行不用每次判断是否合法。我个人的习惯是两种都用候选数组负责枚举映射数组负责生成后半部分。为什么后半部分要用映射而不是再枚举一遍因为后半部分是前半部分唯一确定的枚举它没有意义只会增加复杂度。用映射表逐位转换再逆序是最高效的做法。2.2 奇偶分支的统一处理技巧奇偶分支如果写两套代码容易重复且容易出错。有一种统一处理的方式把构造过程看成“填n个位置”对于位置i从0开始如果i n/2它是自由位如果i n/2且n为奇数它是中间位如果i n/2它由对称位置决定。但更简洁的做法是先构造前半部分长度ceil(n/2)然后根据奇偶决定后半部分怎么补。我倾向于这种先确定前半部分的长度half (n1)/2。枚举前半部分的所有可能注意第一位非零中间位受限。对每个前半部分生成完整的数前半部分 后半部分其中后半部分是前半部分的前n/2位旋转逆序。这里有个细节当前半部分包含中间位时生成后半部分要跳过中间位。也就是说取前半部分的前n/2个字符即去掉可能的中间位逐位映射后逆序拼接。用字符串来处理会比用整数方便很多因为n可能比较大整数会溢出。丙组T2的n一般不会太大但用字符串是更稳妥的选择也更容易处理前导零的判断。2.3 用字符串构造的完整流程我习惯用字符串来拼逻辑清晰且不怕溢出。流程如下第一步确定half (n1)/2这是前半部分的长度。第二步递归或迭代枚举前半部分的每一位。第一位下标0的候选是{1,2,5,6,8,9}n1时其余位置的候选是{0,1,2,5,6,8,9}。如果n为奇数下标half-1这一位是中间位候选是{0,1,2,5,8}。第三步前半部分确定后取它的前n/2个字符即去掉中间位如果存在逐位用映射表转换然后逆序拼到前半部分后面得到完整的中心对称数。第四步按题目要求统计或输出。这个流程的关键在于第三步的“取前n/2个字符”。当n为偶数时half n/2前n/2个字符就是整个前半部分当n为奇数时half (n1)/2前n/2个字符正好排除了最后一位中间位。这个统一处理很优雅避免了两套分支。2.4 候选集合的边界确认写代码之前把每个位置的候选集合列清楚能省掉大量调试时间。位置类型候选数字说明首位n11,2,5,6,8,9不能是0首位n10,1,2,5,8单独处理6和9不行普通自由位0,1,2,5,6,8,9全部合法数字中间位n为奇数0,1,2,5,86和9旋转后互换不行这张表建议直接贴在草稿纸上写代码时对着看。我见过有人把中间位的候选写成全部七个结果6和9出现在中间构造出来的数旋转后中间位变了整个数就不对称了。提示n1是唯一的特殊情况因为此时首位同时也是中间位但0是允许的。如果代码里用“首位非零”一刀切n1就会漏掉0。建议在函数入口单独判断n1直接返回结果。3. 完整实现与关键环节演示3.1 递归枚举前半部分的代码实现下面是我常用的递归写法用字符串累积前半部分到达长度后生成完整数。#include bits/stdc.h using namespace std; int mp[10] {0, 1, 2, -1, -1, 5, 9, -1, 8, 6}; int free_digits[7] {0, 1, 2, 5, 6, 8, 9}; int mid_digits[5] {0, 1, 2, 5, 8}; int first_digits[6] {1, 2, 5, 6, 8, 9}; int n; vectorstring results; void build(string half, int pos, int half_len) { if (pos half_len) { // 生成完整数 string full half; int back_len n / 2; for (int i back_len - 1; i 0; i--) { full char(0 mp[half[i] - 0]); } results.push_back(full); return; } if (pos 0) { // 首位 for (int i 0; i 6; i) { half char(0 first_digits[i]); build(half, pos 1, half_len); half.pop_back(); } } else if (n % 2 1 pos half_len - 1) { // 中间位 for (int i 0; i 5; i) { half char(0 mid_digits[i]); build(half, pos 1, half_len); half.pop_back(); } } else { // 普通自由位 for (int i 0; i 7; i) { half char(0 free_digits[i]); build(half, pos 1, half_len); half.pop_back(); } } } int main() { cin n; if (n 1) { // 一位数特殊处理 cout 5 endl; cout 0 1 2 5 8 endl; return 0; } int half_len (n 1) / 2; string half ; build(half, 0, half_len); cout results.size() endl; for (auto s : results) cout s ; cout endl; return 0; }这段代码有几个地方值得说明。第一build函数里判断中间位的条件是n % 2 1 pos half_len - 1。注意这个判断要放在首位判断之后因为当n1时首位和中间位重合但我们已经单独处理了n1所以这里不会冲突。第二生成后半部分时循环从back_len - 1开始递减到0这就是逆序。half[i]取的是前半部分的前back_len个字符正好排除了中间位。第三用char(0 mp[...])来转换因为mp里存的是整数要转成字符拼进字符串。3.2 迭代写法与递归写法的取舍递归写法直观但如果你对递归不熟迭代写法也可以。迭代的核心是用一个数组记录每一位当前选到候选集合的第几个类似进制计数的进位逻辑。vectorint idx(half_len, 0); while (true) { // 根据idx构造half string half ; for (int i 0; i half_len; i) { if (i 0) half char(0 first_digits[idx[i]]); else if (n % 2 1 i half_len - 1) half char(0 mid_digits[idx[i]]); else half char(0 free_digits[idx[i]]); } // 生成完整数并处理 // ... // 进位 int p half_len - 1; while (p 0) { int limit (p 0) ? 6 : ((n % 2 1 p half_len - 1) ? 5 : 7); idx[p]; if (idx[p] limit) break; idx[p] 0; p--; } if (p 0) break; }迭代写法的好处是不用担心递归深度坏处是进位逻辑容易写错尤其是limit的判断要跟位置类型对应。我一般推荐递归因为可读性更好调试时也更容易定位问题。3.3 手工推演n2和n3验证逻辑拿n2手动跑一遍。half_len (21)/2 1。首位候选是1,2,5,6,8,9。对每个首位back_len 1取half[0]映射后拼上。首位1映射1-1得到11。首位2映射2-2得到22。首位5映射5-5得到55。首位6映射6-9得到69。首位8映射8-8得到88。首位9映射9-6得到96。所以n2的结果是11,22,55,69,88,96共6个。验证一下11旋转还是1169旋转是696变99变6顺序反转后还是69都对。再跑n3。half_len 2。首位候选6个第二位是中间位候选5个。对每个组合back_len 1取half[0]映射拼上。比如首位1中间0half10back取half[0]1映射为1得到101。旋转180度1变10变01变1顺序反转还是101正确。首位6中间0half60back取6映射为9得到609。旋转6变90变09变6反转后是609正确。首位6中间8half68back取6映射为9得到689。旋转6变98变89变6反转后是689正确。这里能看出为什么中间位不能是6或9。如果中间位是6half16back取1映射为1得到161。旋转1变16变91变1反转后是191不等于161所以不合法。代码里中间位候选排除6和9正好避免了这个错误。3.4 输出格式的注意事项不同场次的题目对输出格式要求可能不同有的是输出个数有的是按从小到大输出所有数有的是输出第k个。写代码前一定要把输出要求读清楚。如果是按从小到大输出要注意构造的顺序。上面的递归写法首位按1,2,5,6,8,9的顺序枚举中间位和自由位按0,1,2,5,6,8,9的顺序枚举生成的数天然是递增的吗不一定。因为后半部分是映射逆序得到的映射会打乱大小关系。比如n2时首位6得到69首位8得到88首位9得到96这个顺序是递增的。但首位5得到55首位6得到69也是递增的。实际上由于首位是递增枚举的而首位决定了整个数的主要大小所以整体是递增的。但严格来说如果题目要求排序输出保险起见还是收集完再排一次序。提示如果n比较大结果数量可能很多输出时用printf或者关闭同步的cout避免超时。丙组T2一般n不会太大但养成习惯没坏处。4. 常见错误与排查实录4.1 前导零导致的漏解与多解这是最高频的错误没有之一。表现有两种n1时答案少了0或者n1时答案里出现了以0开头的数。n1漏0的原因是把“首位非零”的规则无差别应用了。修复方法是在主函数入口单独判断n1直接输出0,1,2,5,8。n1多算0开头的原因是在首位枚举时把0也放进去了。修复方法是首位用单独的候选数组first_digits不含0。还有一种隐蔽的情况n1时如果走通用逻辑half_len1首位候选是first_digits不含0中间位判断又因为poshalf_len-1成立而走mid_digits分支两个分支冲突结果不可预期。所以n1必须单独处理不要试图用统一逻辑覆盖。4.2 中间位候选集合写错中间位只能是0,1,2,5,8。如果误用了自由位的七个候选6和9会混进去导致构造出的数旋转后中间位变化不再是中心对称数。排查方法手工构造一个中间位为6的数比如n3时的161旋转后是191验证不相等。然后在代码里打印中间位的候选确认只有五个。这个错误在递归写法里表现为mid_digits数组长度写成7或者在判断中间位时用了free_digits。检查时重点看这两个地方。4.3 后半部分逆序方向搞反生成后半部分时正确的做法是把前半部分的前back_len位逐位映射然后逆序拼接。如果忘记逆序直接顺序拼接得到的数旋转后不相等。举个例子n2首位6。正确做法映射6-9逆序只有一个字符逆序不变得到69。如果顺序拼接也是69看不出问题。但n4时前半部分16back_len2取16映射得到19逆序得到91完整数是1691。旋转180度1变16变99变61变1反转后是1691正确。如果忘记逆序拼成19得到1619旋转后是9161错误。排查方法拿n4手工推几个对比逆序和不逆序的结果。或者直接在代码里打印后半部分的构造过程。4.4 整数溢出与字符串选择如果n比较大比如n15结果可能超出int甚至long long的范围。用整数存储会溢出导致答案错误。用字符串存储就没有这个问题。丙组T2的n一般不超过10int够用但用字符串是更通用的做法。而且字符串处理前导零和逆序都更方便所以我建议一开始就用字符串。如果题目只要求输出个数而不要求输出具体数那更简单直接用数学公式算n1时5个n1时首位6种选择其余自由位7种中间位如果有5种。个数 6 * 7^(half_len - 1 - (n%2)) * (n%2 ? 5 : 1)。但这个公式容易记错还是构造法更稳。4.5 常见问题速查表现象可能原因排查方法修复n1答案少0首位非零规则误用检查n1分支单独处理n1n1出现0开头首位候选含0打印首位候选用first_digits中间位出现6或9候选集合用错打印mid_digits改为五个候选旋转后不相等后半部分未逆序手工推n4逆序拼接大n答案错误整数溢出检查变量类型改用字符串输出顺序不对未排序对比题目要求收集后排序4.6 调试时的一个实用技巧构造类题目调试时最有效的方法是写一个暴力验证函数对构造出的每个数真的做一次旋转180度看是否等于自身。这个函数不需要高效只需要正确。bool check(string s) { string t s; reverse(t.begin(), t.end()); for (char c : t) { if (mp[c - 0] -1) return false; c char(0 mp[c - 0]); } return t s; }注意这里的顺序先反转再逐位映射。因为旋转180度等价于先逆序再逐位变换。用这个函数验证构造结果能快速定位是构造逻辑错了还是映射表错了。我一般会在小nn4时把构造结果全部过一遍check确认无误后再跑大n。这个习惯帮我省了很多时间。5. 从这道题迁移出去的构造思维5.1 构造法的通用套路中心对称数这道题的核心是“部分决定整体”。前半部分定了后半部分就定了。这种思路在很多构造类题目里都能用。比如回文数构造前半部分定了后半部分就是逆序。比如某些对称字符串构造也是类似的逻辑。识别这类题的关键是找到“自由度”在哪里哪些位置可以自由选哪些位置被约束决定。自由度确定了枚举范围就确定了。我在做题时的习惯是先数自由度。中心对称数n位自由度是ceil(n/2)位首位和中间位有额外约束所以枚举量是5^(n/2)级别。这个估算能帮你快速判断构造法是否可行。5.2 映射与逆序的组合模式“先逆序再映射”这个模式值得单独记一下。旋转180度在数学上就是先关于中心翻转逆序再逐位变换。这个分解让实现变得清晰逆序用reverse变换用映射表两步分开做不容易错。类似的组合模式还有“先映射再逆序”对于中心对称数来说两者等价因为映射是逐位的和逆序可交换。但对于其他变换顺序可能有影响写的时候要确认清楚。5.3 边界特殊值的处理原则n1是这道题的特殊值必须单独处理。这类“最小规模特殊”的情况在竞赛题里很常见。处理原则是如果通用逻辑在最小规模上会出错就在入口处拦截单独返回。判断是否需要特殊处理的信号最小规模时某些约束的含义发生了变化。比如n1时首位和中间位重合首位非零和中间位受限两个规则冲突。这种冲突就是需要特殊处理的标志。我在写代码时的习惯是先把n1、n2这些最小情况手工推一遍确认通用逻辑是否覆盖。如果不覆盖就在最前面加分支。这个习惯能避免很多边界错误。5.4 字符串与数值的取舍经验涉及前导零、逆序、逐位操作的题目优先用字符串。涉及算术运算、比较大小的用数值。中心对称数这道题两者都涉及但前导零和逆序是主要操作所以字符串更合适。用字符串的一个额外好处是输出方便直接拼接就行不用处理数值转字符串的格式问题。缺点是字符串比较大小需要额外注意按字典序比较和按数值比较不同但这道题如果要求排序输出可以用stoi转回来或者自定义比较。我个人的经验是只要题目里出现“位”“旋转”“反转”“前导零”这些词直接用字符串别犹豫。数值类型在这些场景下只会添乱。5.5 复杂度估算的实用方法构造法的复杂度估算很简单数一数自由位的个数每个自由位有几种选择乘起来就是枚举量。中心对称数n位自由位是ceil(n/2)个每个自由位最多7种选择所以枚举量上界是7^ceil(n/2)。实际因为首位和中间位的约束会小一些。n10时7^5约一万六完全可控。n20时7^10约2.8亿就有点大了但丙组T2不会出这么大的n。估算完枚举量再估算每个枚举结果的处理时间生成完整数、输出等乘起来就是总时间。如果超过10^7到10^8这个量级就要考虑优化或者换思路。这道题在丙组的n范围内构造法绰绰有余。6. 写在最后的一点个人体会这道题我前前后后讲过很多遍每次都有学生问“为什么中间位不能是6”。我的回答永远是你拿张纸写个161然后真的把它转180度看看。很多人转完发现是191就再也不会忘了。算法题里很多规则死记硬背不如动手推一遍推一次的印象比看十遍题解都深。另一个体会是关于调试。构造类题目出错时别急着改代码先手工推小规模。n1、n2、n3推一遍把正确结果列出来再跟程序输出对比。差异出现的位置往往就是bug所在。这个方法看起来笨但比盯着代码看有效得多。最后说个细节。这道题如果用递归写注意递归深度是ceil(n/2)n在丙组范围内不会超过递归限制可以放心用。但如果哪天遇到n很大的变种题记得换成迭代或者显式栈。习惯性地考虑一下递归深度是个好习惯。
企业数字化 ERP 产品动态
相关推荐
2026大模型学习全景图:从基础原理到项目实战的完整路径 直接分享一张我自己在用的“大模型学习全景图”——不是收藏夹里吃灰的链接列表,而是把 2026 年当下真正值得投入时间的学习路线、核心工具、关键框架和项目实战串成了一条能落地的路径。无论你是刚接触 AI 的在校生,还是已经在用 Java、Python 写业务代… · 2026/11/3 22:17:11
Attention Is All You Need中文翻译:超参核对与复现指南 简介:NIPS 2017 论文《Attention Is All You Need》的中文翻译文档,面向自然语言处理初学者、Transformer 入门者以及需要精读原始论文的研究人员,用于降低英文阅读门槛,系统理解完全基于自注意力机制的序列转导架构。压缩包内仅含… · 2026/11/3 22:58:25
解决VS Code中Kimi Code插件卡Processing状态的方法 1. 问题现象解析:Kimi Code插件卡在Processing状态当Kimi Code插件在Visual Studio Code中持续显示"Processing"状态时,通常表现为以下几种典型症状:插件功能界面长时间显示旋转加载图标代码补全、智能提示等核心功能无响应状态栏插… · 2026/11/3 23:20:38
Excel查重与去重:条件格式、COUNTIF、数据透视表、删除重复项怎么选 拿着一张两万行的客户明细表,被同事问“这里面有没有重复的”,这件事我经历过太多次。更麻烦的不是查不出来,而是很多人上来就点“数据”选项卡里的“删除重复项”,点完弹个框说“删除了 13482 个重复值”,然后发现表里… · 2026/11/4 3:20:23
HarmonyOS分布式数字画板开发实战 1. 项目背景与核心价值去年在深圳的一次开发者交流会上,我亲眼目睹了三位设计师通过手机、平板和智慧屏同时在一幅数字画作上协作的场景。这种打破设备界限的创作方式,正是HarmonyOS分布式能力带来的革命性体验。这次经历直接促使我着手开发这款支持多设… · 2026/11/4 3:20:23
基于链队列与优先队列的银行排队系统离散事件模拟 简介:这份数据结构期末作业以银行排队系统为主题,面向正在学习队列、准备课程设计或期末项目的高校学生,重点处理VIP与普通用户的分级排队、按到达顺序服务以及服务窗口模拟等建模与实现问题。压缩包共9个文件、约1.03MB,包含C源码… · 2026/11/4 3:20:23
电商实时比价系统架构设计与性能优化实践 1. Galaxy比数平台概述在电商平台的技术架构中,商品比价功能一直是提升用户体验和平台竞争力的关键模块。得物技术团队自主研发的Galaxy比数平台,正是为了解决海量商品数据的实时比价需求而设计的分布式计算系统。这个平台目前日均处理超过2亿次比价请求… · 2026/11/4 3:20:23
滑动窗口与堆结构在电商TopK商品统计中的应用 1. 题目背景解析这道来自虾皮(Shopee)2026年校园招聘的笔试真题,反映了当前互联网企业对候选人算法能力的核心考察方向。作为东南亚领先的电商平台,虾皮的笔试题目往往紧密结合实际业务场景,这道3月10日的题目也不例外… · 2026/11/4 3:20:23
APK修改工具实战:结构解析、重打包、签名对齐与排障 简介:面向安卓开发者和逆向入门者的 APK 修改工具资料包,围绕安装包结构认识、界面资源替换、反编译重打包、签名校验与权限调整等常见需求展开,适合希望系统了解安装包组成并动手定制应用的中初级读者。内容从清单配置文件、资源目录、字节码… · 2026/11/4 3:19:23
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46