1. 题目解析与核心思路
LeetCode 1404题要求我们计算将一个二进制字符串表示的整数通过特定操作减少到1所需的最少步骤数。操作规则为:如果当前数是偶数则除以2(相当于右移一位),如果是奇数则加1。这道题看似简单,但其中蕴含着对二进制运算和数学思维的深度考察。
1.1 二进制操作的本质
二进制数的加减乘除在计算机底层都是通过位运算实现的。题目中的两个操作实际上对应着:
- 除以2:二进制右移一位(>>1)
- 加1:二进制数的最低位加1,可能引发进位
例如二进制数"1101"(十进制13):
- 奇数时加1:1101 + 1 = 1110(14)
- 偶数时右移:1110 >> 1 = 111(7)
1.2 算法选择考量
这道题有两种主流解法:
- 模拟法:直接按照题目描述模拟操作过程
- 数学优化法:通过数学规律寻找更优解
对于面试场景,面试官通常期望先看到模拟解法,再探讨优化可能。我们先从最直观的模拟法入手。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模拟法实现详解
2.1 基础实现步骤
模拟法的核心就是按照题目规则一步步操作,直到数字变为1。具体步骤:
- 如果数字已经是1,返回当前步数
- 检查数字的奇偶性:
- 偶数:直接右移一位
- 奇数:加1
- 步数加1
- 重复上述过程
2.2 边界情况处理
实际编码时需要特别注意的边界情况:
- 输入为"1"时直接返回0
- 长二进制字符串的处理(LeetCode测试用例可能很长)
- 前导零的处理(题目保证输入有效,但实际工程中需要考虑)
2.3 Python实现示例
python复制def numSteps(s: str) -> int:
steps = 0
num = int(s, 2)
while num != 1:
if num % 2 == 0:
num = num >> 1
else:
num += 1
steps += 1
return steps
这个基础实现虽然直观,但对于很长的二进制字符串(比如长度超过30位),将字符串转为整数可能会导致溢
