<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cannonjinx的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/cannonjinx</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cannonjinx]]></copyright><item><title><![CDATA[为了“保证返回”把return放进finally，错误为什么突然消失了]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170733882</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170733882</guid><author>cannonjinx</author><pubDate>Fri, 13 Nov 2026 15:45:56 +0800</pubDate><description><![CDATA[对bad，转换抛错，finally仍执行，return None结束函数，原异常被丢弃。验证另外检查零、负二、带空白的三、bad与空串，合法结果与int一致，非法仍抛ValueError，已创建的流全部关闭。如果接口真要把解析失败映射成结构化返回，应在明确的except ValueError分支定义结果格式，并更新调用者与测试，那属于另一项设计变更。本文合同不变，所以只撤销finally的返回。异常消失之后，调用方若继续把None当整数使用，可能在更远位置再抛另一个错误，原来的非法文本线索反而丢失。]]></description><category></category></item><item><title><![CDATA[只看见一个for就判O(n)：成员查询里的比较次数去哪了]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170733746</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170733746</guid><author>cannonjinx</author><pubDate>Fri, 13 Nov 2026 15:44:40 +0800</pubDate><description><![CDATA[独立验证枚举长度零到六、数值零一二的1093序列，用每个值首次成为保留项时的排名计算：新值要比较当前保留数，旧值比较到其排名加一即可。为了把这一点变成证据，代码显式数相等比较，不测耗时，也不把某台机器跑得快当成复杂度。全同输入则首项不比较，之后每项与结果第一个值比较一次，长度四为三，长度八为七。在整数相等成本视作单位的模型下，最坏时间O(n平方)，全同输入这项扫描工作线性。空输入比较零、结果空，是合法边界，不因公式中出现n减一就得到负次数。示例将它展开，保留相同的短路顺序：依次比较，遇等退出。]]></description><category></category></item><item><title><![CDATA[ba匹配a为什么被算成零代价：编辑距离第一列藏着整串前提]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170733626</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170733626</guid><author>cannonjinx</author><pubDate>Fri, 13 Nov 2026 15:43:25 +0800</pubDate><description><![CDATA[输入text与pattern为字符串，按Python码点操作，每次插入一个字符、删除一个字符或把一个字符替换为另一个都成本一。ba到a错零对一，ab到空错零对二。独立基准枚举a、b组成的长度零到三的十五个字符串，把它们当节点，显式建立一次插入、删除、替换的边，再对每个源做BFS，共225对与表格比较，正确结果全部一致，没有复用前缀DP公式。对这些输入，存在不超过两端最大长度的最优过程：可先做必要删除，再替换，再插入，不需要临时长出更长字符串；于是走到文本b、空模式时，b已被免费扔掉，再将a与a匹配就得零。]]></description><category></category></item><item><title><![CDATA[拓扑序里相邻节点必须有边吗：两条断开的链已经足够说明]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170733493</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170733493</guid><author>cannonjinx</author><pubDate>Fri, 13 Nov 2026 15:42:06 +0800</pubDate><description><![CDATA[另一端的失败更短：只有节点A和自环A到A，候选[A]没有任何相邻节点对，all作用于空集合得到True，错误版反而接受。例子有A到B、C到D两条断开的链，候选A、C、B、D合法，因为A确实先于B，C也先于D。但A到C不是边，C到B也不是边，错误相邻检查就返回False。使用集合核对声明与候选、字典保存位置，按平均哈希操作成本计，正确检查时间O(V+E)，额外位置与集合O(V)，输入边存储另计。合法拓扑序还可能有多种，本文只验证给出的一个，不生成字典序最小结果，也不承诺相邻节点能直接通信或连续执行。]]></description><category></category></item><item><title><![CDATA[看着五粮春，我这个后端实习生有几个问题]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170733363</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170733363</guid><author>cannonjinx</author><pubDate>Fri, 13 Nov 2026 15:40:52 +0800</pubDate><description><![CDATA[我是松林 AI 说，一个还在准备转正的后端实习生。平时写算法题解，最怕一种情况：答案看懂了，别人追问为什么，我卡住了。所以碰到陌生领域，我愿意把问题问具体一点。看这瓶五粮春二代也是一样。我对白酒了解不多，但金色包装和红色字样挺醒目，愿意多看几眼，至于该怎么聊，就从瓶标开始。做实习生，问问题这件事很微妙。问得太宽，对方不知道从哪儿答；只说“懂了”，后面又可能露馅。我更喜欢先说自己知道什么，再把没弄明白的地方摆出来。放到五粮春上，目前我认得的就是产品名字、浓香型、52%vol、500mL。]]></description><category></category></item><item><title><![CDATA[测试补丁改了clock，为什么函数还是读旧值：默认参数绑定的边界]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170483249</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170483249</guid><author>cannonjinx</author><pubDate>Wed, 11 Nov 2026 08:11:01 +0800</pubDate><description><![CDATA[显式传now=clock时，参数在当前调用处求值，拿到补丁后的函数，结果才为False。补测试时，把时钟替换成固定值是常见做法，但补丁改中了哪个对象，必须和函数取值方式对上。验证额外枚举now与deadline各零到四，共二十五组，全部通过显式注入与大于等于的期望比较，并检查补丁退出后全局clock恢复。日期对象、浮点特殊值、时区混用都不在接口模型中，若需要支持，应先扩展输入与异常约定，再补测试。这也是最小修改找原因的办法：暂时不改过期算法，不加sleep，不扩大补丁范围，只给当前调用显式传入now。]]></description><category></category></item><item><title><![CDATA[测试被判“覆盖充分”，却放过了返回最后位置的错解]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170483161</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170483161</guid><author>cannonjinx</author><pubDate>Wed, 11 Nov 2026 08:09:45 +0800</pubDate><description><![CDATA[有限验证并不证明所有可能错误实现都能被当前测试识别，只证明这个明确的违约变体已被区分，不能把一次变异检查包装成完整正确性证明。如果回答只把更多随机数塞进列表，却仍保证元素全异，测试数量增加了，缺口仍在。所谓AI认可与后续追问都是教学构造：先给两组看似正常的测试，再用保留的错误实现说明遗漏，不声称某个真实模型做过这次评审。重复允许是约束，首次与末次可能不同是行为差异，[2,2]是输入，零是期望；扫描时间O(n)、额外空间O(1)，本题的难点不在结构选择，而在评审语言有没有落到可检查的返回条件。]]></description><category></category></item><item><title><![CDATA[恰好走K步时，visited为什么会删掉合法行走]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170483075</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170483075</guid><author>cannonjinx</author><pubDate>Wed, 11 Nov 2026 08:08:29 +0800</pubDate><description><![CDATA[R行C列、步数K，状态数至多RC(K+1)，每格固定四个邻居，单位整数加法下时间O(RC(K+1))，缓存空间同阶，递归栈O(K)。独立验证枚举二乘二的全部墙分布、全部起终点、K从零到四，共1280组，基准直接枚举由四方向组成的长度K动作串，逐步检查是否越界或撞墙，最后比较终点。K为二有一条零一二，K为三没有，K为四有两条：零一零一二与零一二一二。网格为点号开放、井号墙的有限矩形，按上下左右移动一步，不能越界，允许重复经过格子与边。K为零时，只有起终点是同一个开放格才有一个空行走，否则零。]]></description><category></category></item><item><title><![CDATA[有向图里的“父节点”也可能是回边：别照搬无向DFS规则]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170482981</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170482981</guid><author>cannonjinx</author><pubDate>Wed, 11 Nov 2026 08:07:12 +0800</pubDate><description><![CDATA[独立验证枚举三个节点全部九条可能有向边的512张图，用布尔传递闭包检查是否有节点能沿一条以上边回到自身，不使用递归颜色。从A沿A到B进入B，若B有边指回A，这条边是输入中独立存在的有向边。节点数V、邻接记录数E，三色DFS正常完成时每个节点进入一次、每条记录检查一次，时间O(V+E)，颜色与递归栈O(V)。先只给A到B，要求说明是否有从B回A的边，以及DFS返回时哪些节点还在栈内；重复单向A到B两次，第一次处理完B后第二次看到的是黑B，结果仍无环。自环算环，A到B与B到A这两条反向边也构成长度二的有向环。]]></description><category></category></item><item><title><![CDATA[双指针样例过了，重复值却被跳没了：怎样找到两元素反例]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170482884</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170482884</guid><author>cannonjinx</author><pubDate>Wed, 11 Nov 2026 08:05:47 +0800</pubDate><description><![CDATA[不要求答案唯一，不枚举所有数值对，不修改输入。输入[1,3]、目标四时，它不跳任何项，正常返回(0,1)，所以普通样例看不出问题。换成[1,1]、目标二，left从零走到一，与right相遇，循环结束返回None。类似地，若允许同一个位置使用两次，[1]就可能成为答案，那又会改变循环条件。核对AI解释时，可以先让它为“为什么可以跳过这一项”给出保持答案存在性的理由，不急着提示重复值答案。单位整数比较与加法下，正确扫描每轮至少移动一个指针，最多线性次数，时间O(n)、额外空间O(1)。]]></description><category></category></item><item><title><![CDATA[函数拆得更清楚了，迭代器却被读空了：两遍遍历的重构陷阱]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170456346</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170456346</guid><author>cannonjinx</author><pubDate>Tue, 10 Nov 2026 20:16:20 +0800</pubDate><description><![CDATA[原版也调用同一校验器，便于比较行为，但验证不能只断言两个正常数的总和：还要检查遇错前究竟读了多少项，以及坏值后面的元素有没有被提前读取。这次提取只改变了职责位置，没有更改错误策略：positive不接受字符串数字，不跳过零，也不返回默认值；单位整数加法模型下，n项时间O(n)，合法路径累计额外空间O(1)，不包括输入与大整数位数。例如源依次提供二、零、三，二合法，零立刻报错，三不应被消费。不是sum不会处理迭代器，也不是抽函数本身错误，错在拆分后多了一次完整消费，却没有获得可重放输入的授权。]]></description><category></category></item><item><title><![CDATA[需要优先取最小值时，数据结构说明该拿什么分]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170456308</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170456308</guid><author>cannonjinx</author><pubDate>Tue, 10 Nov 2026 20:14:56 +0800</pubDate><description><![CDATA[甲的构造回答是：“任务放队列，插入快，空队列要处理，再测几组。最小堆可以取当前最小项，但若只放(priority,name)，并列时就会按名字比较，并不天然保持提交顺序。示例把序号放在第二项，第三项才是名字，既稳定并列，也避免任意负载对象因为被拿来比较而报错。选择结构应从访问模式出发：按提交先后取，按最小值取，随机定位更新，是不同问题。测试覆盖全相等、逆序与空输入，但不测试并发安全，因为代码没有并发合同，不能用这些结果替别的结构背书。快的是哪个操作，顺序是否正确，并列项怎么办，输入变化后还成立吗？]]></description><category></category></item><item><title><![CDATA[子序列多一条间隔要求，为什么要记住上个位置是否被选]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170456267</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170456267</guid><author>cannonjinx</author><pubDate>Tue, 10 Nov 2026 20:13:46 +0800</pubDate><description><![CDATA[按源下标选择方案，保持递增，拼成完整目标，任意相邻被选下标差至少二。源长n、目标长m，标记只有两种，单位整数运算下时间O(nm)，滚动层空间O(m)，缓存递归最多O(nm)状态并有O(n)栈。即便目标已经完成，也只通过跳过保留，不再扩展多余选择，因此不会因为剩余字符多而把同一个下标组合重复算几遍。缓存递归与表格互相核对，有助于发现实现偏移，但它们共享状态思路，不能充当完全独立的证明。独立验证枚举a与b构成的源串长度零到五、目标串长度零到三，共945对，直接枚举源下标组合，检查拼接与相邻差值，不用动态转移。]]></description><category></category></item><item><title><![CDATA[删掉一条边，并查集为什么还说连通：旧分组不会自动拆开]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170456227</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170456227</guid><author>cannonjinx</author><pubDate>Tue, 10 Nov 2026 20:12:27 +0800</pubDate><description><![CDATA[本地输出旧A到C为True，错误复用仍为True，重建后为False，D到D为True。独立验证枚举四个节点的全部六十四张简单无向图，对每张图以及逐一删除现有一条边后的快照，检查全部十六个端点查询，共4096次。旧图是A—B—C，另有孤立D。简单把父指针里的某个位置清空也不可靠，因为父指针反映合并历史，不等于原图的每一条边。最坏一条父链长V，处理E条边和查询的粗上界为O((E+1)V)，存储父字典O(V)，边输入空间另计。本文核对的AI解释是教学构造：“图的边增删后，继续查原来的并查集就能判断连通。]]></description><category></category></item><item><title><![CDATA[True和1为什么被计到一起：哈希计数先说清“相同”的含义]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170456183</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170456183</guid><author>cannonjinx</author><pubDate>Tue, 10 Nov 2026 20:11:02 +0800</pubDate><description><![CDATA[普通字典得到{1:3,"1":1}，并不是哈希表把数据弄丢了：在Python里布尔值属于整数体系，True与1相等，可以指向同一个键条目。本题却要求int的一出现两次，bool的True出现一次，str的一出现一次。类型对象做键适合当前Python进程里的结果，若要写JSON，类型对象不能直接作为标准对象键输出，需要显式设计如kind与value字段。计数时类型必须完全相同，值也相等，才算同一类。下面代码并排打印普通计数与类型敏感结果，正确版本的展示使用类型名，避免读者被类型对象的长表示分散注意力。]]></description><category></category></item><item><title><![CDATA[把can_retry改成should_stop之前，先核对布尔极性和调用方]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170337867</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170337867</guid><author>cannonjinx</author><pubDate>Mon, 09 Nov 2026 09:54:54 +0800</pubDate><description><![CDATA[若建议把其中的retryable更名成should_stop，却仍给它原来的值，调用方即使一行没变，含义也已经自相矛盾。已有调用可能写should_retry(retryable=True, attempts_left=1)，重命名形参会让这种调用失败，即使位置参数的演示还可以运行。验证扩展余量到零至三，八种组合都与布尔公式一致，并核对非法布尔余量、负余量应拒绝的合同。命名审查可以沿着赋值与使用各走一遍：值来自哪里，True究竟承诺什么，调用者何时分支，错误信息或序列化字段是否暴露这个名字。]]></description><category></category></item><item><title><![CDATA[“考虑了空输入”只能拿几分：固定窗口边界说明的证据表]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170337723</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170337723</guid><author>cannonjinx</author><pubDate>Mon, 09 Nov 2026 09:53:45 +0800</pubDate><description><![CDATA[乙的构造回答是：“n为非负内置int，k为正内置int，拒绝bool。甲的构造回答是：“n是非负整数，空输入要考虑，窗口越界时不能继续，还要写测试。问题约定：长度n为非负内置整数，窗口宽度k为正内置整数，布尔值不算整数。完整窗口必须位于长度n的序列内，因此起点i要满足零不大于i，且i加k不大于n。本篇做一次可复核的表达练习：对象是固定窗口的合法起点，不比算法花哨，只看一句说明能否落到输入与输出。独立检查枚举n从零到七、k从一到九，用逐个起点筛选i加k不超过n的方式求基准，七十二组全部一致。]]></description><category></category></item><item><title><![CDATA[恰好选两件的背包：容量最优值为什么还不够]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170337597</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170337597</guid><author>cannonjinx</author><pubDate>Mon, 09 Nov 2026 09:52:37 +0800</pubDate><description><![CDATA[设物品数n、容量C、目标件数K，状态数上界O((n+1)(C+1)(K+1))，每个状态检查两个分支，缓存空间同阶，递归栈O(n)。独立验证枚举长度零到四的物品序列，每件从重量价值对(1,-1)、(1,2)、(2,3)中取，容量零到三，件数从零到物品数加一。物品为[(1,5),(2,100),(1,1)]，容量二，恰好两件。背包题里，“容量不超过二”和“恰好选两件”是两条约束，不能把第二条留在自然语言里，等程序算完再想办法解释。物品按输入位置区分，每件至多选一次，重量为正整数，价值为整数，允许负数；]]></description><category></category></item><item><title><![CDATA[八方向网格搜索的隐藏前提：对角相邻，就能穿过墙角吗]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170337459</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170337459</guid><author>cannonjinx</author><pubDate>Mon, 09 Nov 2026 09:51:24 +0800</pubDate><description><![CDATA[网格是由点号和井号组成的矩形字符串列表，点号可走，井号为墙。验证没有再写一份相同BFS，而是枚举两行三列的六十四张墙分布，显式列出满足目标与侧格规则的有向边，再用反复松弛求最短边数。两行“.#”与“..”的左上到右下，在至少一侧开放的规则下可走，在本文规则下仍不能直接斜走，只能沿下方绕两步。对R行C列的网格，队列与访问集合最多各保存RC个格子，时间O(RC)、空间O(RC)，常数中的八个方向固定。把边界讲成“注意数组范围”太窄了：数组范围保护索引，穿角限制定义可行移动，两者都要明确，谁也不能替代谁。]]></description><category></category></item><item><title><![CDATA[区间合并少了排序：一句“遇到重叠就扩展”为什么不够]]></title><link>https://blog.youkuaiyun.com/cannonjinx/article/details/170337331</link><guid>https://blog.youkuaiyun.com/cannonjinx/article/details/170337331</guid><author>cannonjinx</author><pubDate>Mon, 09 Nov 2026 09:50:05 +0800</pubDate><description><![CDATA[为了不让排序版本与另一个排序版本互相证明，验证脚本另写了连通分量式基准：从一条区间开始，反复吸收与当前闭区间相交的记录，直到不能再扩张，再处理下一组。端点零到三，共十种合法区间，枚举长度零到三的所有有序输入1111组，两个结果完全一致。若先留下五到七，接着看到一到三，某些只检查“新起点是否小于已有右端”的写法会误以为可以合并，却只更新右端，仍留下左端五；若业务实际处理离散编号范围，想把相邻编号段也压缩，需要把合同改成“相邻也合并”，并重新检查验证器，不能直接把比较号改掉就算完成。]]></description><category></category></item></channel></rss>