多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

二进制间距(Binary Gap)解法详解:从遍历到位运算的相邻 1 距离问题

二进制间距(Binary Gap)解法详解:从遍历到位运算的相邻 1 距离问题 教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载本篇题解以《算法通关手册》仓库中 binary-gap.md 的完整题解为主体围绕 LeetCode 0868「二进制间距」展开。文章先梳理题目约束与两个官方示例再逐行剖析「遍历二进制字符串」的核心解法及其复杂度最后结合仓库中 位运算专题 的底层原理给出不依赖字符串转换的纯位运算写法帮助读者在掌握本题的同时理解二进制相邻 1 距离的本质。读完本文你将能独立分析相邻 1 的最大间距这一类位运算问题并随手写出 O(log n) 的解法。题目概览题号LeetCode 0868 Binary Gap标签位运算难度简单题解出处docs/solutions/0800-0899/binary-gap.md该题同时收录在仓库的 LeetCode 题解总表 与 位运算题目列表 中是位运算入门阶段的一个典型练习。题目大意给定一个正整数 $n$数据范围 $1 \le n \le 10^9$要求找到并返回 $n$ 的二进制表示中两个相邻 $1$ 之间的最长距离。如果不存在两个相邻的 $1$返回 $0$。这里两个相邻的 1指的是二进制串中相邻出现的两个1即按顺序看前一个1和后一个1之间没有其他1距离定义为它们在二进制串中的位置下标之差。题目只要求相邻 1 的距离非相邻的 1中间还隔着其他 1之间的距离不在统计范围内。官方示例示例 1输入n 22 输出2 解释22 的二进制是 10110。 在 22 的二进制表示中有三个 1组成两对相邻的 1。 第一对相邻的 1 中两个 1 之间的距离为 2。 第二对相邻的 1 中两个 1 之间的距离为 1。 答案取两个距离之中最大的也就是 2。以 $22$ 的二进制串10110为例从右往左数下标从 0 开始下标 1、2、4 处各有一个1。相邻的 1 共有两对下标 1 与 2 之间的距离为 $1$下标 2 与 4 之间的距离为 $2$。取最大值为 $2$。示例 2输入n 8 输出0 解释8 的二进制是 1000。 在 8 的二进制表示中没有相邻的两个 1所以返回 0。$8$ 的二进制是1000只含一个1不存在两个相邻的 1直接返回 $0$。这也是边界条件的关键——二进制表示中只有 0 个或 1 个1时答案恒为 0。思路 1遍历二进制字符串算法步骤使用 Python 内置函数bin(n)将正整数 $n$ 转为二进制字符串bin_n。注意bin(n)返回的字符串带有0b前缀例如bin(22)的结果是0b10110。设置两个变量pre记录上一个1所在的位置下标ans记录当前已发现的两个相邻 1 之间的最长距离。从下标2开始遍历字符串跳过0b前缀遇到字符1时用i - pre计算当前1与上一个1之间的距离用max(ans, i - pre)更新最长距离将pre更新为当前下标i。遍历结束后返回ans。关键细节为什么pre初始化为 2由于bin(n)的结果形如0b10110前两个字符是0b真正的二进制数字从下标 2 开始。将pre初始化为2相当于把前缀末尾的下标 2 当作虚拟的上一个 1 的位置这样在第一次遇到1时执行i - pre不会产生错误距离第一个遇到的1位于下标 2即0b1...情形时i - pre 0此时ans max(0, 0) 0不影响结果若第一个1出现在更靠后的位置i - pre得到的是第一个1相对起点 $2$ 的偏移量同样不会误入答案因为ans的初始值为 $0$而真正有效的相邻距离只会从第二个1开始被更新。这一初始化的思路与仓库 位运算专题 中反复强调的二进制位下标从 0 开始、前缀属于元数据的视角一致。参考代码以下为原题解给出的完整实现class Solution: def binaryGap(self, n: int) - int: bin_n bin(n) pre, ans 2, 0 for i in range(2, len(bin_n)): if bin_n[i] 1: ans max(ans, i - pre) pre i return ans复杂度分析时间复杂度$O(\log n)$。整数 $n$ 的二进制串长度为 $\lfloor \log_2 n \rfloor 1$遍历一次即可得到答案。空间复杂度$O(1)$。除返回值外只使用了常数个变量bin(n)产生的中间字符串不计入额外空间的严格分析时可视为算法核心仅使用常数辅助空间。思路 2纯位运算解法不依赖字符串字符串遍历写法直观易懂但题目标签是位运算。结合仓库 位运算专题 中给出的常用位操作表我们完全可以只对整数本身操作不产生任何中间字符串。用到的两个基础位操作是n (n - 1)将二进制最右侧的 1 置为 0专题第 3.6 节n 1整体右移一位去掉最后一位专题常用操作表第 3 条。算法思路每次用n (n - 1)找到当前最低位的 1所在的位置等价于逐个取出相邻的 1再通过右移统计两个相邻 1 之间的位间隔。实现如下class Solution: def binaryGap(self, n: int) - int: last -1 # 上一个 1 所在的位置最低位方向计数 ans 0 pos 0 # 当前扫描到的二进制位下标从最低位 0 开始 while n: if n 1: # 当前最低位是 1 if last ! -1: ans max(ans, pos - last) last pos n 1 # 右移一位等价于去掉刚刚检查过的最低位 pos 1 return ans两种写法的核心思想完全一致只统计相邻 1 的距离忽略中间间隔的其他位。区别仅在于思路 1 借助字符串下标计算距离思路 2 借助右移计数计算距离。该写法与仓库中 0191. 位 1 的个数 的循环按位计算解法同源——那里用n 1配合右移统计 1 的个数这里进一步把相邻两个 1 的位置差记录为答案。两种思路的复杂度一致$O(\log n)$ 时间、$O(1)$ 空间。边界情况与易错点只有一个 1如 $n 8$二进制1000只有一个 1不存在相邻的两个 1返回 $0$。字符串遍历写法中ans从未被更新天然保持 $0$。全是 1 的连续段如 $n 7$二进制111相邻 1 之间的距离均为 $1$答案为 $1$。注意这里的距离是位置下标之差不是二进制串中字符之间的间隔字符数下标差 1 即为最近距离。bin()前缀处理忘记跳过0b前缀、或pre初始值设置不当会导致第一次更新时算入前缀字符的位置产生错误的距离。这是字符串写法中最常见的失误点。n的上限题目保证 $1 \le n \le 10^9$因此二进制串最长约 30 位任何 O(log n) 的遍历都不会有性能压力。知识关联本题在仓库位运算体系中的位置本题是仓库 位运算专题 的典型配套练习该专题完整讲解了二进制与十进制互转、六种基本位运算按位与、按位或|、按位异或^、取反~、左移、右移以及常用操作速查表如x (x - 1)清除最低位 1、x 1去掉最后一位、(x (k - 1)) 1取右数第 k 位等。在做本题前建议先通读该专题 13 节建立起二进制位下标与位操作之间的映射直觉。与本题类似的统计/定位二进制中 1的练习还包括0191. 位 1 的个数用n (n - 1)或循环右移统计 1 的个数0405. 数字转换为十六进制数进制转换类位运算问题0268. 丢失的数字利用异或性质求解缺失元素。更多同主题题目可在 位运算题目列表 中继续检索。总结二进制间距问题的本质是在二进制表示中找出所有相邻 1 之间的最大下标差。无论采用遍历字符串还是纯位运算实现核心都是维护上一个 1 的位置并逐对更新最大值。字符串写法胜在直观、适合讲解位运算写法胜在无额外空间、贴近底层。本题在仓库中的完整题解见 binary-gap.md配套理论见 位运算专题建议结合二者对照学习一次吃透相邻 1类位运算问题的通法。赞分享教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载相关推荐leetcode 题解821. 字符的最短距离双向遍历解法全解析leetcode 题解821. 字符的最短距离双向遍历解法全解析 本篇技术指南基于本仓库题解 problems/821.shortest distance文档教程知识库最完整hnswlib核心原理剖析从空间距离计算到近似最近邻算法最完整hnswlib核心原理剖析从空间距离计算到近似最近邻算法 Hnswlib是一个高效的近似最近邻搜索库专为大规模向量检索场景设计。这个头文件C库配合搜索引擎机器学习uBlock Origin 3 分钟装好用免费广告拦截器装完即用uBlock Origin 3 分钟装好用免费广告拦截器装完即用 uBlock Origin 是 Chromium 和 Firefox 上的免费开源内容拦截网络安全应用安全上一篇ThinkPad风扇噪音终极解决方案TPFanCtrl2智能控温完全指南下一篇Windows本地实时语音转文字5分钟掌握TMSpeech高效办公利器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表