You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效计算二进制字符串对应位不同位数?解决TLE问题

优化二进制字符串差异位计数,解决超时问题

嘿,你的问题我太懂了——原来的逐位循环异或方法在数据量一大就超时,对吧?这很正常,纯Python的字符遍历效率确实拉胯,咱们换个更高效的思路:利用整数位运算替代逐字符操作,底层的C实现可比Python循环快太多了!

问题根源

原代码的时间复杂度是O(n*m),n是数组长度,m是二进制字符串的长度。当n或m很大时,循环次数直接爆炸,自然就触发超时了。

优化方案:整数位运算+统计1的个数

二进制字符串可以直接转成整数,两个整数异或后,结果里的每一位1就代表原数对应位不同。我们只需要统计异或结果中1的个数,就能得到单个字符串和目标的差异位数,再累加所有结果即可。

代码实现(Python 3.10+)

def req_fun(arr, b):
    target = int(b, 2)  # 把目标二进制字符串转成整数
    total_diff = 0
    for s in arr:
        num = int(s, 2)
        # 异或后统计1的个数,bit_count()是Python3.10新增的高效方法
        total_diff += (num ^ target).bit_count()
    return total_diff

兼容旧Python版本的写法

如果你的Python版本低于3.10,用bin(x).count('1')替代bit_count()就行,虽然稍慢一点,但还是比原方法快很多:

def req_fun(arr, b):
    target = int(b, 2)
    total_diff = 0
    for s in arr:
        num = int(s, 2)
        total_diff += bin(num ^ target).count('1')
    return total_diff

额外优化:处理重复字符串

如果你的数组里有大量重复的二进制字符串,可以先用Counter统计频率,避免重复计算,进一步提升效率:

from collections import Counter

def req_fun(arr, b):
    target = int(b, 2)
    str_counter = Counter(arr)
    total_diff = 0
    for s, count in str_counter.items():
        num = int(s, 2)
        diff_bits = (num ^ target).bit_count()
        total_diff += diff_bits * count
    return total_diff

验证示例

拿你给出的例子测试:arr=['1100'],b='1010'

  • 1100转整数是12,1010转整数是10
  • 异或结果:12 ^ 10 = 6(二进制0110)
  • 统计1的个数是2,和示例结果一致,完全正确!

内容的提问来源于stack exchange,提问作者p.ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:34:54