693.交替位二进制数:位运算(O(1)非O(log n))

【LetMeFly】693.交替位二进制数:位运算(O(1)非O(log n))

力扣题目链接:https://leetcode.cn/problems/binary-number-with-alternating-bits/

给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

 

示例 1:

输入:n = 5
输出:true
解释:5 的二进制表示是:101

示例 2:

输入:n = 7
输出:false
解释:7 的二进制表示是:111.

示例 3:

输入:n = 11
输出:false
解释:11 的二进制表示是:1011.

 

提示:

  • 1 <= n <= 231 - 1

解题方法:位运算

假设原来数字是101010,那么右移一位后变成010101,异或变成111111

当且仅当原数字$n$是01交替时有$n\ \hat{}\ (n>>1)$全是1

假设$x=n\ \hat{}\ (n>>1)$,如何判断$x$中是否全是$1$呢?令111111+1=10000001000000&111111=0

当且仅当$x$二进制下全是1时有$x&(x+1)=0$。

  • 时间复杂度$O(1)$
  • 空间复杂度$O(1)$

注意计算过程中不要超过有符号型int32

AC代码

C++

1
2
3
4
5
6
7
8
9
10
/*
* @LastEditTime: 2026-02-18 14:54:30
*/
class Solution {
public:
bool hasAlternatingBits(int n) {
unsigned x = (n >> 1) ^ n;
return ((x + 1) & x) == 0;
}
};

Python

1
2
3
4
5
6
7
'''
LastEditTime: 2026-02-18 15:02:19
'''
class Solution:
def hasAlternatingBits(self, n: int) -> bool:
x = (n >> 1) ^ n
return (x + 1) & x == 0

Java

1
2
3
4
5
6
7
8
9
/*
* @LastEditTime: 2026-02-18 15:00:15
*/
class Solution {
public boolean hasAlternatingBits(int n) {
int x = (n >> 1) ^ n;
return (x & (x + 1)) == 0;
}
}

Go

1
2
3
4
5
6
7
8
9
/*
* @LastEditTime: 2026-02-18 15:01:13
*/
package main

func hasAlternatingBits(n int) bool {
x := (n >> 1) ^ n
return (x & (x + 1)) == 0
}

Rust

1
2
3
4
5
6
7
8
9
/*
* @LastEditTime: 2026-02-18 14:59:11
*/
impl Solution {
pub fn has_alternating_bits(n: i32) -> bool {
let x: usize = ((n >> 1) ^ n )as usize;
(x & (x + 1)) == 0
}
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源


693.交替位二进制数:位运算(O(1)非O(log n))
https://blog.letmefly.xyz/2026/02/18/LeetCode 0693.交替位二进制数/
作者
发布于
2026年2月18日
许可协议