LeetCode二进制字符串相加问题:测试用例返回结果错误求助
二进制字符串相加问题的修复方案
问题分析
针对测试用例a='11'、b='1',你的代码返回'10'而非正确结果'100',核心问题出在结果十进制转二进制的循环逻辑:
- 第二个
while循环仅以resultdecimal!=0为条件,当resultdecimal被减至0后,剩余的低位未处理,导致遗漏末尾的0。 - 未处理结果为0的边界情况(如
a='0'、b='0'时会返回空字符串)。
错误触发的具体过程
当resultdecimal=4时:
- 第一个循环计算出
powerdecimal=3(因为2^3=8>4,循环停止)。 - 进入第二个循环:
- 第一次判断:
4 >= 2^3?否 →powerdecimal减到2,resultstring加'0'。 - 第二次判断:
4 >=2^2?是 →resultdecimal变为0,powerdecimal减到1,resultstring加'1'。 - 此时
resultdecimal=0,循环直接终止,未处理powerdecimal=1和0的位,最终resultstring='01',反转后得到'10'。
- 第一次判断:
修复后的代码
class Solution(object): def addBinary(self, a, b): adecimal = 0 bdecimal = 0 powera = 0 powerb = 0 # 二进制转十进制逻辑保留,这部分是正确的 for x in a[::-1]: if x == '1': adecimal += 2 ** powera powera += 1 for i in b[::-1]: if i == '1': bdecimal += 2 ** powerb powerb += 1 resultdecimal = adecimal + bdecimal # 处理结果为0的边界情况 if resultdecimal == 0: return '0' powerdecimal = 0 resultstring = '' # 找到最高位的幂次 while resultdecimal >= 2 ** powerdecimal: powerdecimal += 1 # 调整为实际最高位的幂次(循环结束时powerdecimal多了1) powerdecimal -= 1 # 循环条件改为powerdecimal >=0,确保所有位都被处理 while powerdecimal >= 0: if resultdecimal >= 2 ** powerdecimal: resultdecimal -= 2 ** powerdecimal resultstring += '1' else: resultstring += '0' powerdecimal -= 1 return resultstring
关键修改点
- 新增边界处理:当
resultdecimal=0时直接返回'0',避免空字符串。 - 调整最高位幂次:第一个循环结束后,
powerdecimal多了1,减1回到实际最高位的幂次(比如4的最高位是2^2,所以powerdecimal应设为2而非3)。 - 修改循环条件:将第二个循环的条件改为
powerdecimal >=0,确保从最高位到最低位(2^0)的每一位都被处理,不会遗漏任何位。
测试a='11'、b='1'时:
resultdecimal=4,调整后powerdecimal=2。- 处理
2^2:4>=4 → 减4,resultstring加'1',powerdecimal=1。 - 处理
2^1:0>=2?否 → 加'0',powerdecimal=0。 - 处理
2^0:0>=1?否 → 加'0',powerdecimal=-1,循环结束。 - 最终
resultstring='100',返回正确结果。
内容的提问来源于stack exchange,提问作者Tobias Quartier
相关产品推荐
相关产品推荐

