2026-09-09:恰好一对连续置位。用go语言,给定一个整数,检查它的二进制形式里是否正好有一处“11”这样的连续两位都是1,并且不能有其他相邻的1对,也不能有多于一对。满足条件则返回真,否则返回假。

0 <= n <= 100000。

输入: n = 6。

输出: true。

解释:

6 的二进制表示为 110 。

恰好存在一对相邻的置位("11")。因此,答案为 true 。

题目来自力扣3950。

第一步:构造标记“相邻 1 对”的掩码m

  1. 1. 对原整数n进行右移一位操作,得到n >> 1
    右移后,原来二进制中第i+1位的值,移动到了第i位的位置上。

  2. 2. 将原整数nn >> 1按位相与,得到m = n & (n >> 1)

  3. 3. 按位与的结果中,第i位为1当且仅当:

    也就是说,m的每一个1位,都对应原二进制中一个连续的“11”对。
    因此,m1的个数,就等于原二进制中相邻置位对的数量。

  • • 原整数n的第i位是1

  • • 原整数n的第i+1位也是1

第二步:判断m中是否恰好只有一个1

题目要求正好有一对连续置位,也就是要求m1的个数必须恰好为1

代码中的判断方式是:

  • • 首先检查m > 0,保证至少存在一个相邻1对;

  • • 然后检查m & (m - 1) == 0

m & (m - 1) == 0是判断一个数是否为2的幂的经典方法。
m > 0时,该条件成立,意味着m的二进制表示中有且只有一个1

如果m中有两个或更多个1,说明原二进制中存在多处相邻置位对,不符合要求,返回false
如果m == 0,说明不存在相邻置位对,也返回false

第三步:返回结果

只有当:

  • m > 0:至少有一处连续置位;

  • m & (m - 1) == 0:连续置位对的数量恰好为一处;

同时满足时,才返回true,否则返回false

举例说明

以输入n = 6为例:

  • 6的二进制是110

  • n >> 1得到3,二进制是011

  • m = 110 & 011 = 010,二进制中只有一个1

  • m > 0成立,且m & (m - 1) = 2 & 1 = 0成立。

  • • 所以返回true

再比如n = 7,二进制是111

  • n >> 13,二进制011

  • m = 111 & 011 = 011,有两个1,说明存在两处相邻置位对。

  • m & (m - 1) = 3 & 2 = 2 != 0,返回false

时间复杂度

整个过程中只使用了固定次数的位运算和比较操作,与输入整数的大小无关。
因此时间复杂度为:

O(1)

额外空间复杂度

算法只使用了有限的几个整型变量,没有使用数组、切片、递归栈等额外数据结构。
因此额外空间复杂度为:

O(1)

Go完整代码如下:

package main

import "fmt"

func consecutiveSetBits(n int) bool {
m := n & (n >> 1) // 所有相邻比特位的 &
return m > 0 && m&(m-1) == 0 // m 是否恰好有一个 1
}

func main() {
n := 6
result := consecutiveSetBits(n)
fmt.Println(result)
}
打开网易新闻 查看精彩图片

Python完整代码如下:

# -*-coding:utf-8-*-

def consecutive_set_bits(n: int) -> bool:
m = n & (n >> 1) # 所有相邻位都为 1 的位置
return m > 0 and (m & (m - 1)) == 0 # m 是否恰好只有一个 1

if __name__ == "__main__":
n = 6
print(consecutive_set_bits(n))
打开网易新闻 查看精彩图片

C++完整代码如下:

  


bool consecutiveSetBits(int n) {
int m = n & (n >> 1); // 所有相邻位都为1的位置
return m > 0 && (m & (m - 1)) == 0; // m 是否恰好只有一个1
}

int main() {
int n = 6;
bool result = consecutiveSetBits(n);
std::cout << std::boolalpha << result << std::endl;
return 0;
}
打开网易新闻 查看精彩图片

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。