二进制全1子串查找与Python实现

上周三下午,我坐在常去的咖啡馆看着邻桌小哥在笔记本上敲代码。他皱着眉头嘟囔:"怎么才能找到二进制字符串里全是1的部分呢?"这让我想起两年前自己初学时的困惑——今天就让我们像拼乐高积木那样,拆解这个有趣的问题。

第一步:把字母装进0和1的盒子里

记得小时候玩过密码本游戏吗?计算机存储字符的方式就像高级版的密码本。我们常用的ASCII编码表里,每个字母都对应着8位二进制数

字符ASCII码二进制
H7201001000
i10501101001

转换过程就像给每个字符打包:

  • 1. 查ASCII表获取十进制数值
  • 2. 用除二取余法转换
  • 3. 补足8位长度

举个栗子:把"Hi"变成二进制

当处理到字母i时:

  1. 105 ÷ 2 = 52 余1 ↑
  2. 52 ÷ 2 = 26 余0 ↑
  3. 26 ÷ 2 = 13 余0 ↑
  4. 13 ÷ 2 = 6 余1 ↑
  5. 6 ÷ 2 = 3 余0 ↑
  6. 3 ÷ 2 = 1 余1 ↑
  7. 1 ÷ 2 = 0 余1 ↑
倒着读取余数得到1101001,补零后就是01101001。

第二步:在01森林里寻找全1绿洲

假设我们已经得到二进制串01001(这是"Hi"的二进制形式),现在要找到其中连续全是1的区域。就像在迷宫里找最长的直道:

  • 准备两个计数器:当前连胜记录current_streak和历史最高记录max_streak
  • 遇到1就增加current_streak
  • 遇到0就重置current_streak为0
  • 每次变化时更新max_streak

实战演练:01101110这个二进制串

位置字符current_streakmax_streak
0000
1111
2122
3002
4112
5122
6133
7003

最终发现最长全1子串是第5-7位的三个1。这种算法的时间复杂度是O(n),就像检查超市货架上的商品一样逐个查看。

用Python代码实现整个过程

试着在代码编辑器中敲入这些:

def string_to_binary(text):return ''.join(format(ord(c), '08b') for c in text)def find_max_ones(binary_str):max_count = current = 0for bit in binary_str:current = current + 1 if bit == '1' else 0max_count = max(max_count, current)return max_count使用示例text = "Hibinary = string_to_binary(text)print(f"'{text}'的二进制是:{binary}")print("最长全1子串长度:", find_max_ones(binary))

运行后会看到输出:

  • 二进制表示:01001
  • 最长全1子串长度是2(出现在两个i的二进制中)

当你在现实世界遇到它们

上周帮朋友调试网络协议时,发现这种技巧可以用来检测数据帧中的同步信号。在CTF竞赛中,有位选手用类似方法破解了隐藏在图片二进制中的旗标。就连DNA序列分析有时也会用到这种模式匹配方法。

二进制全1子串查找与Python实现

窗外的阳光斜照在咖啡杯上,杯底残留的咖啡渍像是某种神秘的二进制编码。也许下次点单时,你可以试着把拿铁的英文名翻译成二进制看看?

郑重声明:以上内容均源自于网络,内容仅用于个人学习、研究或者公益分享,非商业用途,如若侵犯到您的权益,请联系删除,客服QQ:841144146

相关推荐

返回顶部