关于LeetCode第67题二进制字符串求和的解法咨询及使用条件语句删除字符的问题
LeetCode第67题二进制字符串求和的解法咨询及使用条件语句删除字符的问题
嘿,刚刷完LeetCode第67题「二进制字符串求和」对吧?这题是字符串操作里的基础经典题,我当年刷的时候也踩过几个小坑,来给你唠唠思路和靠谱的实现方案,顺便帮你把可能没写完的代码补全解释清楚~
先再明确下题目要求,避免理解偏差:
给你两个二进制字符串
a和b,返回它们相加后的二进制字符串。
举两个典型例子:
- 输入
a = "11",b = "1",输出得是"100"- 输入
a = "1010",b = "1011",输出得是"10101"
这题的核心逻辑其实和我们手动算二进制加法一模一样——从最后一位开始逐位加,处理好进位就行。具体可以拆成这几个步骤:
- 用两个指针分别怼在两个字符串的末尾,从后往前遍历
- 搞个
carry变量记录进位,一开始是0 - 每一位的总和等于「a当前位的数值(如果还没遍历完) + b当前位的数值(如果还没遍历完) + 上一轮的进位」
- 算当前位的结果:用总和模2(
sum % 2),然后更新进位:总和整除2(sum // 2) - 把当前位的结果存起来,等全部加完后反转一下,就是正确顺序的结果了
给你贴个完整的Python实现代码,注释写得很清楚,你对照着看:
def addBinary(a: str, b: str) -> str: # 初始化两个指针,分别指向两个字符串的最后一位 i, j = len(a) - 1, len(b) - 1 carry = 0 # 记录进位 result = [] # 用列表存中间结果,比直接拼接字符串效率高 # 只要还有位没遍历,或者还有进位没处理,就继续循环 while i >= 0 or j >= 0 or carry > 0: # 取出当前位的数字,如果指针已经越界(字符串遍历完了),就取0 digit_a = int(a[i]) if i >= 0 else 0 digit_b = int(b[j]) if j >= 0 else 0 # 计算当前位的总和 total = digit_a + digit_b + carry # 当前位的结果是总和模2 current_bit = str(total % 2) # 更新进位,总和整除2 carry = total // 2 # 把当前位加入结果列表(注意此时是逆序的) result.append(current_bit) # 指针左移一位,继续处理下一位 i -= 1 j -= 1 # 反转结果列表,得到正确顺序的二进制字符串 return ''.join(reversed(result))
这里给你划几个容易踩坑的点:
- 为什么用
while循环而不是for?因为两个字符串长度可能不一样,而且最后加完可能还有进位要补(比如两个最长位相加后得进1,这时候得在结果最前面补个1) - 指针越界时取0:比如
a是"11",b是"1001",当a的指针已经移到开头前面了,就相当于a前面补了两个0,不影响求和 - 用列表存结果再反转:Python里字符串是不可变的,每次拼接都会生成新字符串,用列表append再最后join效率高很多
另外看你标题里提到“使用条件语句删除字符”的问题,是不是担心结果里会有前导0?其实上面的解法不会有这个问题,因为循环只有在还有位或者还有进位的时候才会跑,最后反转出来的结果不会有多余的前导0。但如果你真的需要处理比如输入有前导0,或者自己的代码生成了前导0的情况,可以用条件判断来处理:
# 假设你得到的结果字符串是result_str,比如"00100" if result_str.startswith('0') and len(result_str) > 1: # 找到第一个不是0的位置,从那里开始截取 for idx, char in enumerate(result_str): if char != '0': result_str = result_str[idx:] break else: # 全是0的情况,保留一个0 result_str = '0'
不过这个在核心解法里是多余的,主要是给你补个场景参考~
看你说写了部分代码但没贴全,如果有卡壳的地方,比如某个逻辑没搞懂,或者自己的代码有bug,随时说出来我再帮你调!
备注:内容来源于stack exchange,提问作者Onion_in_1945
相关产品推荐
相关产品推荐

