1. 题目解析与核心思路
LeetCode 1404题要求我们计算将一个二进制字符串表示的整数通过特定操作减少到1所需的最少步骤数。这道题看似简单,但实际考察了对二进制运算、模拟操作和数学思维的掌握程度。
题目给出的操作规则非常明确:
- 如果当前数是偶数,直接除以2(对应二进制右移一位)
- 如果当前数是奇数,则加1(对应二进制加法操作)
1.1 二进制操作的本质
理解二进制运算的本质是解决本题的关键。在二进制表示中:
- 除以2操作相当于删除最低位的0(右移一位)
- 加1操作则可能引发连续的进位传播
例如二进制数"1101"(十进制13):
- 加1操作会变成"1110"(14)
- 而"1100"(12)除以2则变成"110"(6)
1.2 算法选择考量
这道题有两种主流解法:
- 直接模拟法:按照题目描述的操作步骤逐步处理二进制字符串
- 数学优化法:通过观察操作规律找出数学上的最优路径
对于面试场景,面试官通常期望看到完整的模拟过程,因为这能更好地展示编程能力和细节处理能力。而数学方法虽然高效,但可能无法全面展示编码技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模拟法实现详解
2.1 基础实现步骤
模拟法的核心思路是直接按照题目要求的操作步骤进行处理,直到数字变为1。具体步骤如下:
- 初始化步骤计数器steps=0
- 当二进制字符串长度>1时循环:
- 如果最后一位是'0'(偶数):
- 执行右移操作(删除最后一位)
- 如果最后一位是'1'(奇数):
- 执行加1操作(需要考虑进位)
- steps++
- 如果最后一位是'0'(偶数):
- 返回steps
2.2 加1操作的实现细节
二进制字符串的加1操作是本问题中最复杂的部分,需要正确处理进位:
python复制def add_one(binary_str):
carry = 1
result = []
# 从右向左处理每一位
for bit in reversed(binary_str):
if bit == '1' and carry == 1:
result.append('0')
carry = 1
e
