qinghuan
← 查看最新一轮文章

往期新增 / 2026.10.23 / 24 篇

把状态、估计与输入边界看清楚

先猜一次结果,再操作页面实验,最后下载同一份源码复验。这一轮把后端行为、AI 目标、工具输入和基础算法放进小而完整的例子,附阅读准备、原始资料、实测环境与独立练习。

先看本文的问题是否与你有关,再读正文、运行示例、记录自己的结果。阅读分钟数不包含环境准备和实验时间;示例验证范围在运行说明及下载包内标明。

后端:读写、匹配与线程协作的边界

先从字节与输入读取开始;并发两篇另需基本线程概念。运行 Java 示例需要完整 JDK 17 或更新版本。

这一组留下什么:把每次调用影响的内容、位置和状态分别记录,用实际 Java 输出核对。

想连着练,可以从这几步开始
  1. ByteBuffer 已经设为只读,里面的字节为什么还会变?

    先分清内容与视图:只读限制谁来写,复制又保留了什么。

  2. 同样一个正整数,转成字节为什么会多出开头的 00?

    再看相同字节的不同解释:符号、宽度与数值需要分别约定。

  3. 把字节放回去以后,为什么原始流的位置没有倒退?

    把这两个区别带到输入流:记录原始位置、待重读内容与结束状态。

  4. 正则只检查中间一段,为什么锚点和前后文仍会改变结果?

    最后检查一次匹配到底覆盖哪里,以及重置后哪些设置还保留。

这是一条建议顺序;遇到当前项目的问题,也可以直接选择下面对应的文章。每篇的前置阅读另有说明。

阅读约 18 分钟 · 另留动手时间

可以先在页面里动手

一个分支早就失败,allOf 为什么还没有结束?

手动推进三个真实 CompletableFuture,区分等待全部、任意完成、取消聚合,以及保留每项失败。

适合排查:一个分支早就失败,allOf 为什么还没有结束?

开始前:能阅读 Java 方法调用与 try/catch

  • Java 17
  • CompletableFuture
  • allOf
  • 异常传播
  • 可运行实验
开始阅读与练习 ↗

阅读约 18 分钟 · 另留动手时间

可以先在页面里动手

ByteBuffer 已经设为只读,里面的字节为什么还会变?

对照共享视图、独立游标、slice 范围与真正复制出来的快照,查清“只读”限制的是哪条写入路径。

适合排查:ByteBuffer 已经设为只读,里面的字节为什么还会变?

开始前:认识 byte 数组和下标

  • Java 17
  • ByteBuffer
  • 只读视图
  • 共享数据
  • 可运行实验
开始阅读与练习 ↗

阅读约 20 分钟 · 另留动手时间

可以先在页面里动手

同样一个正整数,转成字节为什么会多出开头的 00?

对照 127、128、255 与负数,分清 BigInteger 的有符号表示、无符号解释和协议要求的固定字节宽度。

适合排查:同样一个正整数,转成字节为什么会多出开头的 00?

开始前:认识十六进制和 byte 数组

  • Java 17
  • BigInteger
  • 字节编码
  • 符号位
  • 可运行实验
开始阅读与练习 ↗

阅读约 23 分钟 · 另留动手时间

可以先在页面里动手

正则只检查中间一段,为什么锚点和前后文仍会改变结果?

固定 XabcY 中的 abc,用四种边界组合核对锚点、前后视与匹配范围,再检查 reset 和 find(start) 会重置什么。

适合排查:正则只检查中间一段,为什么锚点和前后文仍会改变结果?

开始前:知道字符串下标从零开始,区间可包含起点而不包含终点

  • Java 17
  • Matcher
  • 正则区域
  • 锚点
  • 可运行实验
开始阅读与练习 ↗

阅读约 23 分钟 · 另留动手时间

可以先在页面里动手

把字节放回去以后,为什么原始流的位置没有倒退?

用内存字节流观察回推缓冲,分清单字节与数组的顺序、容量上限,以及把 -1 当字节塞回去的后果。

适合排查:把字节放回去以后,为什么原始流的位置没有倒退?

开始前:知道 InputStream.read 返回 int,普通字节与结束标记需要区分

  • Java 17
  • PushbackInputStream
  • 字节流
  • EOF
  • 可运行实验
开始阅读与练习 ↗

AI:算清学习目标,也验清工具输入

训练实验用到概率、平均值、对数和导数;工具输入实验只需会读 Python 和 JSON。各篇附对应基础入口。

这一组留下什么:用有限模型核对估计与梯度,再用实际校验库检查工具参数;分别说明数学、软件验证与真实运行的边界。

想连着练,可以从这几步开始
  1. 写了日期格式,为什么 2 月 31 日仍通过工具校验?

    做工具接口可以从这里开始:结构、格式与业务范围,逐层核对。

  2. 两种工具参数都填对了,为什么 oneOf 反而拒绝?

    再设计互斥输入方式:先数成功分支,再决定是否满足契约。

  3. 工具参数复用了基础规则,新增字段为什么总被拒绝?

    最后复用已有契约:弄清额外字段限制在哪一层生效。训练方向可直接从下方标签平滑与概率分歧开始。

这是一条建议顺序;遇到当前项目的问题,也可以直接选择下面对应的文章。每篇的前置阅读另有说明。

阅读约 14 分钟 · 另留动手时间

可以先在页面里动手

奖励减去同批平均值,为什么学习信号会少一截?

从两次抛硬币的完整枚举,分清常数基线、同批均值和留一法;停止梯度也不能代替统计独立。

适合排查:奖励减去同批平均值,为什么学习信号会少一截?

开始前:知道概率期望是按概率加权的平均

  • 策略梯度
  • REINFORCE
  • RLOO
  • 统计偏差
开始阅读与练习 ↗

阅读约 19 分钟 · 另留动手时间

可以先在页面里动手

写了日期格式,为什么 2 月 31 日仍通过工具校验?

用真实 jsonschema 校验器比较默认配置与格式检查,再把格式名拼错、字段类型和业务日期范围分别验清楚。

适合排查:写了日期格式,为什么 2 月 31 日仍通过工具校验?

开始前:知道 JSON 对象由字段和值组成

  • Agent工程
  • JSON Schema
  • 格式校验
  • 日期
  • 可运行实验
开始阅读与练习 ↗

阅读约 20 分钟 · 另留动手时间

可以先在页面里动手

两种工具参数都填对了,为什么 oneOf 反而拒绝?

数清每个分支是否成立,再区分“恰好一个分支”与“恰好填一栏”,用明确模式修正输入合同。

适合排查:两种工具参数都填对了,为什么 oneOf 反而拒绝?

开始前:知道 properties 与 required 的作用

  • Agent工程
  • JSON Schema
  • oneOf
  • 工具契约
  • 可运行实验
开始阅读与练习 ↗

阅读约 22 分钟 · 另留动手时间

可以先在页面里动手

工具参数复用了基础规则,新增字段为什么总被拒绝?

用真实 jsonschema 比较六份组合合同,找出关闭额外字段的位置,以及 allOf 为什么不会替你合并声明。

适合排查:工具参数复用了基础规则,新增字段为什么总被拒绝?

开始前:知道 properties、required 与 additionalProperties 的作用

  • Agent工程
  • JSON Schema
  • allOf
  • 额外字段
  • 可运行实验
开始阅读与练习 ↗

计算机:跟着状态变化,找到算法成立的条件

能读 Python 列表、循环与函数;先手算小例子,再执行独立验证。

这一组留下什么:分清数组值、对象身份、可行边界和舍入误差,用另一种算法核对结果。

想连着练,可以从这几步开始
  1. 给第3到第7天都加5,为什么只改两个格子就够了?

    先画七个格子,亲手还原两端标记如何影响中间各项。

  2. 三台机器同时生产,最早第几秒够七件?

    把手算换成真假判断:每一步都解释为什么答案还在边界之间。

  3. 链表两个节点都写着7,能说明它们在同一位置吗?

    再走一遍链表:相同数值、相同对象、首次相遇与入口分别记录。

  4. 投票算法最后留下一个名字,就代表它超过半数了吗?

    最后保留一次独立核验:选出了候选,并不代表答案条件已经满足。

这是一条建议顺序;遇到当前项目的问题,也可以直接选择下面对应的文章。每篇的前置阅读另有说明。

阅读约 28 分钟 · 另留动手时间

可以先在页面里动手

窗口里的最小值走了,为什么不能只记住一个最小数?

用会过期的下标保存候选,观察相等值如何替换,以及双重循环为何仍可只做线性总工作。

适合排查:窗口里的最小值走了,为什么不能只记住一个最小数?

开始前:会按下标读取列表,并能读懂 while 循环。

  • 单调队列
  • 滑动窗口
  • 过期边界
  • 摊还分析
开始阅读与练习 ↗

阅读约 32 分钟 · 另留动手时间

可以先在页面里动手

哈希表删掉一个键,为什么后面的键也会突然查不到?

用五个槽位观察碰撞、绕回和删除标记,特别检查更新旧键时为什么不能见到空位就写。

适合排查:哈希表删掉一个键,为什么后面的键也会突然查不到?

开始前:会使用字典保存键值对,理解同一个键再次赋值是更新。

  • 哈希表
  • 线性探测
  • 删除标记
  • 重复键
开始阅读与练习 ↗

阅读约 26 分钟 · 另留动手时间

可以先在页面里动手

投票算法最后留下一个名字,就代表它超过半数了吗?

把候选、抵消余额和真实出现次数分开:一遍挑出候选,再用第二遍判断它有没有严格超过半数。

适合排查:投票算法最后留下一个名字,就代表它超过半数了吗?

开始前:会遍历列表、比较两个值是否相等,并统计出现次数。

  • Boyer–Moore
  • 严格多数
  • 二遍核验
  • 算法边界
开始阅读与练习 ↗

阅读约 30 分钟 · 另留动手时间

可以先在页面里动手

往上找第五级上级,为什么可以只跳两次?

预先记录向上 1、2、4、8 层的位置,把查询拆成几次跳跃,同时守住根节点和缺失下标的边界。

适合排查:往上找第五级上级,为什么可以只跳两次?

开始前:理解一棵有根树中,每个非根节点只有一个父节点。

  • 树查询
  • 倍增
  • 二进制
  • 缺失哨兵
开始阅读与练习 ↗

阅读约 25 分钟 · 另留动手时间

可以先在页面里动手

给第3到第7天都加5,为什么只改两个格子就够了?

把每天的数改写成相邻变化:在开始处加上增量,在结束处撤销,再从左到右还原。用空区间、末端和重叠更新检查下标。

适合排查:给第3到第7天都加5,为什么只改两个格子就够了?

开始前:会用列表下标、循环和整数加减;知道第1天对应下标0。

  • 差分数组
  • 批量区间加
  • 半开区间
  • 独立核对
开始阅读与练习 ↗

阅读约 30 分钟 · 另留动手时间

可以先在页面里动手

先加一个大数,再加1:那个1为什么消失了,又怎样把它找回来?

用一份补偿记录找回部分丢失的小量,再故意让补偿记录也舍入。比较朴素累加、Kahan、Neumaier 与精确输入参考。

适合排查:先加一个大数,再加1:那个1为什么消失了,又怎样把它找回来?

开始前:会读循环、加减和列表;知道 float 只能保存有限精度。

  • 浮点求和
  • Kahan
  • Neumaier
  • Fraction
  • 误差边界
开始阅读与练习 ↗

阅读约 29 分钟 · 另留动手时间

可以先在页面里动手

链表两个节点都写着7,能说明它们在同一位置吗?

沿 next 一直走,有时会到头,有时会绕圈。用快慢指针检查节点身份,再把首次相遇、环入口和环长分开找清楚。

适合排查:链表两个节点都写着7,能说明它们在同一位置吗?

开始前:认识对象、变量和 while 循环;能顺着 next 找到下一个节点。

  • 链表
  • 对象身份
  • Floyd算法
  • 环入口
  • 独立核对
开始阅读与练习 ↗

阅读约 27 分钟 · 另留动手时间

可以先在页面里动手

三台机器同时生产,最早第几秒够七件?

机器耗时没有排成一张答案表,也能二分:先判断某一时刻够不够,再始终夹住最后一个不够与第一个够用的边界。

适合排查:三台机器同时生产,最早第几秒够七件?

开始前:会写循环与整数除法;知道“至少7件”包括7件、8件和更多。

  • 二分答案
  • 整数整除
  • 单调判断
  • 边界不变量
开始阅读与练习 ↗