第1章|数值与哈希

Unit 01 · LeetCode #9 回文数

仅本次页面有效
U01
Palindrome NumberDigit · Half Reverse · Invariant

不反转整个整数,
只把右半边搬到一面“数字镜子”里。

本题不是在背一个回文判断技巧,而是在训练一种数值状态建模:用 % 10 消费最低位,用 // 10 缩短原数,并让 reversed_half 逐步保存右半部分的镜像。

检测到上次学习进度阶段、问题、动画、代码、迁移槽位和编辑器高度均可恢复。

LeetCode #9|回文数|Palindrome Number

标签:数学 · 数位处理
简单

题目

给你一个整数 x。如果 x 是回文整数,返回 true;否则返回 false。回文整数从左向右和从右向左读取都相同。

class Solution: def isPalindrome(self, x: int) -> bool: pass

进阶:不将整数转换为字符串。题面来源:LeetCode #9

示例与约束

输入:x = 121
输出:true
输入:x = -121
输出:false
输入:x = 10
输出:false

-2³¹ ≤ x ≤ 2³¹ - 1

认知任务 1
先判断哪些输入根本不需要进入循环
负数包含负号;非零且末位为 0 的整数反转后会出现前导 0。它们可以在数位循环之前直接排除。
回文数实验台状态 1 / 4
关键决策槽位训练

先把前四个环节形成的算法判断翻译成 Python 表达式,再进入真实运行轨迹。

先填关键决策,再解锁逐行联动
① 理解提示→② 填写关键槽位→③ 检查→④ 解锁逐行轨迹
关键槽位补全5 个决策,不考机械语法
槽位 1 · 边界拦截待填写
哪些输入可以在数位循环之前直接判为 False?
提示:考虑两类结构上不可能形成回文的输入:负数,以及“非零但最低位为 0”的整数。
槽位 2 · 镜像初态待填写
还没有搬运任何数位时,reversed_half 应该从什么状态开始?
提示:它表示“已经搬到右半镜像中的数位”,开始时还没有任何数位。
槽位 3 · 中点停止待填写
什么时候还需要继续从 x 搬运最低位?
提示:未处理左侧仍明显长于已经构造的右半镜像时继续;到达或越过中点就停止。
槽位 4 · 构造右半镜像待填写
怎样把 x 当前的最低位接到 reversed_half 的末尾?
提示:先给已有镜像的右侧腾出一个十进制位,再取出 x 的最低位放进去。
槽位 5 · 最终判定待填写
循环结束后,怎样用一个布尔表达式同时覆盖偶数位和奇数位回文?
提示:偶数位时两半直接相等;奇数位时忽略 reversed_half 中多出来的中间位。
实时拼接后的代码骨架空槽位显示 ____

              
固定的 x //= 10 是前面已经建立过的“消费最低位”动作,因此不再拆成机械槽位。
代码 × 状态逐行联动未解锁
先完成上方 5 个关键决策。全部正确后,这里才会开始逐行执行。
当前 x—
本轮 digit—
reversed_half—
条件 / 动作等待解锁
返回结果—
完成槽位检查后,逐步观察代码行、x、digit 与 reversed_half 如何同步变化。

迁移目标:LeetCode #7 整数反转

不从空白开始写代码。先复用 #9 的数位消费动作,再识别“反转全部数位、保留符号、推入前检查溢出”三个新增任务;随后完成槽位拼接,并用真实运行轨迹验证。

LeetCode #7|整数反转|Reverse Integer

标签:数学 · 数位处理
中等

迁移原题

给你一个 32 位有符号整数 x,返回其数字部分反转后的结果。如果反转结果超出 32 位有符号整数范围 [-2³¹, 2³¹-1],返回 0。

假设运行环境不允许存储 64 位整数。

class Solution: def reverse(self, x: int) -> int: pass

题面来源:LeetCode #7

示例与约束

输入:x = 123
输出:321
输入:x = -123
输出:-321
输入:x = 120
输出:21

-2³¹ ≤ x ≤ 2³¹ - 1

复用的是“数位搬运器”,不是整段答案

#9 已掌握

digit = x % 10 提取最低位,x //= 10 删除最低位,result = result * 10 + digit 拼接数位。

→
#7 继续使用

同样逐位搬运,但不在中点停止,而是处理完全部数位。

认知迁移:底层动作完全相同;变化的是循环终点、符号处理和状态合法性检查。

相对 #9,新增三项职责

#9 回文数#7 整数反转
负数直接返回 False保存符号,反转数字部分
只反转右半部分反转全部数位
最终比较两半返回完整反转值
不需要输出范围判断每次推入 digit 前检查 32 位上界
状态 1:remaining

尚未消费的正数部分,来自 abs(x)。

状态 2:reversed_value

已经按相反顺序拼好的数位。

状态 3:sign

记录最终结果应为正还是负。

状态 4:limit

正数上界 2147483647;负数绝对值上界 2147483648。

将 7 个片段放入正确执行顺序

先点击左侧片段,再点击右侧槽位。槽位拼接用于确认控制流,不要求你直接默写完整函数。

代码片段
执行顺序
提示:先确定符号与上界,再逐位提取;溢出检查必须发生在乘 10 和加 digit 之前。

先运行拼接结果,再只补 5 个关键表达式

sign—
remaining—
digit—
reversed_value—
limit—
结果尚未运行
完成槽位拼接后,选择一个案例运行。
迁移代码:只补关键表达式不是从空白写完整代码
class Solution: def reverse(self, x: int) -> int: sign = remaining = reversed_value = 0 limit = while remaining: digit = remaining % 10 remaining //= 10 if : return 0 reversed_value = reversed_value * 10 + digit return
✓

Unit 01 已完成:停留在这里整理你的数位处理 Skill

页面不会自动进入下一题。你可以继续回看任意阶段、重跑迁移轨迹,或手动进入 Unit 02。

手动进入 Unit 02:加一

Unit 01 Skill:逐位消费 + 半反转状态

触发信号

题目要求不借助字符串处理整数数位、镜像、反转或进位。

状态

x 保存未处理左半;reversed_half 保存已取出右半的逆序。

循环不变量

每轮开始时,两者共同包含原整数尚未完成比较的全部信息。

边界

负数提前失败;非零末位 0 提前失败;奇数位忽略镜像中的中间位。

已保存