868.二进制间距:位运算
【LetMeFly】868.二进制间距:位运算
力扣题目链接:https://leetcode.cn/problems/binary-gap/
给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。
如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,"1001" 中的两个 1 的距离为 3 。
示例 1:
输入:n = 22 输出:2 解释:22 的二进制是 "10110" 。 在 22 的二进制表示中,有三个 1,组成两对相邻的 1 。 第一对相邻的 1 中,两个 1 之间的距离为 2 。 第二对相邻的 1 中,两个 1 之间的距离为 1 。 答案取两个距离之中最大的,也就是 2 。
示例 2:
输入:n = 8 输出:0 解释:8 的二进制是 "1000" 。 在 8 的二进制表示中没有相邻的两个 1,所以返回 0 。
示例 3:
输入:n = 5 输出:2 解释:5 的二进制是 "101" 。
提示:
1 <= n <= 109
解题方法:位运算
以样例一的二进制n = 10110为例,我们只需要在n非零时使用一个变量cnt记录遇到下一个1之前一共有几位就好了,再次遇到1时更新答案最大值并重置cnt。
1 | |
但是问题在于如何得到第一个1的位置,很简单,可以借助lowbit的思想,n & -n得到最低位的1及后面的0(lowbit(10110) = 10)令n / lowbit(n)即相当于抹掉了低位的所有0,n / lowbit(n) >> 1相当于抹掉了最低位的1及其右边的所有0(10110 / lowbit(10110) >> 1 = 101),这样就找到最低位1的位置了。
- 时间复杂度$O(\log n)$
- 空间复杂度$O(1)$
AC代码
C++
1 | |
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源
868.二进制间距:位运算
https://blog.letmefly.xyz/2026/02/22/LeetCode 0868.二进制间距/