【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<=
1
解题方法:位运算
假设原来数字是101010,那么右移一位后变成010101,异或变成111111。
当且仅当原数字n
nn是01交替时有n
>
(n>>1)n -0.25em;">^style="height:
1。
假设x
=
(n>>1)x=n -0.25em;">^style="height:
xx中是否全是1
11呢?令111111+1=1000000,1000000&111111=0。
当且仅当x
xx二进制下全是1时有x
&
x\&(x+1)=0x&(x+1)=0。
- 时间复杂度O
style="margin-right:
0.0278em;">O
(1) - 空间复杂度O
style="margin-right:
0.0278em;">O
(1)
注意计算过程中不要超过有符号型int32。
AC代码
C++
/*@LastEditTime:
*/
classSolution{public:boolhasAlternatingBits(intn){unsignedx=(n>>1)^n;return((x+1)&x)==0;}};Python
'''LastEditTime:
'''
classSolution:defhasAlternatingBits(self,n:int)->bool:x=(n>>1)^nreturn(x+1)&x==0Java
/*@LastEditTime:
*/
classSolution{publicbooleanhasAlternatingBits(intn){intx=(n>>1)^n;return(x&(x+1))==0;}}Go
/*@LastEditTime:
*/
packagemainfunchasAlternatingBits(nint)bool{x:=(n>>1)^nreturn(x&(x+1))==0}Rust
/*@LastEditTime:
*/
implSolution{pubfnhas_alternating_bits(n:i32)->bool{letx:usize=((n>>1)^n)asusize;(x&(x+1))==0}}同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源


