ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/8/13 21:25:57 拓冰建站 浏览量
LeetCode 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 nn01交替时有n ^ ( n > > 1 ) n\ \hat{}\ (n>>1)n^(n>>1)全是1

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

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

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

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

AC代码

C++
/* * @LastEditTime: 2026-02-18 14:54:30 */classSolution{public:boolhasAlternatingBits(intn){unsignedx=(n>>1)^n;return((x+1)&x)==0;}};
Python
''' LastEditTime: 2026-02-18 15:02:19 '''classSolution:defhasAlternatingBits(self,n:int)->bool:x=(n>>1)^nreturn(x+1)&x==0
Java
/* * @LastEditTime: 2026-02-18 15:00:15 */classSolution{publicbooleanhasAlternatingBits(intn){intx=(n>>1)^n;return(x&(x+1))==0;}}
Go
/* * @LastEditTime: 2026-02-18 15:01:13 */packagemainfunchasAlternatingBits(nint)bool{x:=(n>>1)^nreturn(x&(x+1))==0}
Rust
/* * @LastEditTime: 2026-02-18 14:59:11 */implSolution{pubfnhas_alternating_bits(n:i32)->bool{letx:usize=((n>>1)^n)asusize;(x&(x+1))==0}}

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

千篇源码题解已开源