1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| def hasAlternatingBits(n):
while n:
sam = n % 2
n //= 2
if sam == n %2:
return False
return True
# 打表
def hasAlternatingBits(n):
return n in {
1, 2, 5, 10, 21, 42, 85, 170, 341, 682, 1365, 2730, 5461, 10922,
21845, 43690, 87381, 174762, 349525, 699050, 1398101, 2796202, 5592405,
11184810, 22369621, 44739242, 89478485, 178956970, 357913941, 715827882,
1431655765
}
# 异或
def hasAlternatingBits(self, n: int) -> bool:
a = n ^ (n >> 1)
return a & (a + 1) == 0
# https://leetcode-cn.com/problems/binary-number-with-alternating-bits/comments/35738
'''
分析:
如果n是交替的01,对于它右移一位后得到的m,
存在n跟m在二进制下必然是0和1对应的(对位)。异或运算必定都是1;
举个栗子:5=101 5>>1=10,5^(5>>1)=111 (这是伪代码)
101
10 =111
其他情况都不会满足这个特征。所以temp=n^(n>>1)必定满足temp=2^N-1=2^3-1=7;
而temp+1后是N+1位二进制数2^(N+1)=8=1000。
所以temp&(temp+1)==0;
如果满足这个等式就是就是交替位二进制数
'''
# python内置函数 bin()
def hasAlternatingBits(n):
return not ('11' in bin(n) or '00' in bin(n))
|