2026-09-09:恰好一对连续置位。用go语言,给定一个整数,检查它的二进制形式里是否正好有一处“11”这样的连续两位都是1,并且不能有其

网易专栏1个月前发布 admin
22 0 0

🤖 AI总结

主题

使用位运算判断一个整数的二进制表示中是否恰好存在一对连续置位。

摘要

利用位运算计算掩码并判断是否为2的幂,以O(1)时间确定整数二进制中是否恰好含有一对相邻置位。

关键信息

  • 1 通过 n & (n >> 1) 计算相邻1对的位置掩码m。
  • 2 判断m是否大于0且m为2的幂(即m & (m-1)==0)来确保恰好一对。
  • 3 提供Go、Python、C++三种语言实现,时间复杂度O(1)。

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

0 <= n <= 100000。

输入: n = 6。

输出: true。

解释:

6 的二进制表示为 110 。

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

题目来自力扣3950。

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

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

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

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

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

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

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

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

    题目要求正好有一对连续置位,也就是要求m中1的个数必须恰好为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 >> 1是3,二进制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)
    }

    2026-09-09:恰好一对连续置位。用go语言,给定一个整数,检查它的二进制形式里是否正好有一处“11”这样的连续两位都是1,并且不能有其

    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))

    2026-09-09:恰好一对连续置位。用go语言,给定一个整数,检查它的二进制形式里是否正好有一处“11”这样的连续两位都是1,并且不能有其

    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;
    }

    2026-09-09:恰好一对连续置位。用go语言,给定一个整数,检查它的二进制形式里是否正好有一处“11”这样的连续两位都是1,并且不能有其

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

    © 版权声明

    相关文章