1. 问题重述与理解
LeetCode 1404题要求我们计算将一个二进制数通过特定操作减少到1所需的步骤数。具体规则如下:
- 如果当前数字是偶数,则将其除以2
- 如果当前数字是奇数,则将其加1
题目保证输入总是可以按上述规则变为1。输入是一个由'0'和'1'组成的字符串,长度在1到500之间,且第一个字符总是'1'。
1.1 操作规则的本质分析
这个问题的核心在于理解二进制数的奇偶性判断和加减操作在二进制层面的表现:
- 奇偶判断:二进制数的最低位决定奇偶性。最低位为0是偶数,为1是奇数
- 除以2操作:二进制数右移一位,相当于去掉最右边的0
- 加1操作:从最低位开始,连续的1会变为0,直到遇到第一个0变为1
例如:
- 二进制"1101"(13)是奇数,加1得到"1110"(14)
- 二进制"10"(2)是偶数,除以2得到"1"(1)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础解法:直接模拟
2.1 模拟思路
最直观的解法是模拟题目描述的操作过程:
- 将二进制字符串转换为十进制数
- 根据当前数值的奇偶性执行相应操作
- 记录操作步骤直到数值变为1
然而,这种方法对于大数(如500位二进制数)效率极低,因为:
- 500位二进制数转换为十进制可能超过普通数据类型的表示范围
- 每次操作都需要完整的数值转换
2.2 二进制层面的模拟优化
更高效的方法是在二进制层面直接模拟操作过程:
python复制def numSteps(s: str) -> int:
steps = 0
while s != '1':
if s[-1] == '0': # 偶数,除以2
s = s[:-1]
else: # 奇数,加1
s = addOne(s)
steps += 1
return steps
def addOne(s: str) -> str:
s = list(s)
i = len(s) - 1
while i >= 0 and s[i] == '1':
s[i] = '0'
i -= 1
if i >= 0:
