693、交替位二进制数
给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。
示例1:
输入:n = 5
输出:true
解释:5 的二进制表示是:101
示例2:
输入:n = 7
输出:false
解释:7 的二进制表示是:111.
示例3:
输入:n = 11
输出:false
解释:11 的二进制表示是:1011.
思路:
看到位,这里很容易想到位运算,记录位运算的结果,然后比较位运算是否与上次计算的相反。
class Solution:
def hasAlternatingBits(self, n: int) -> bool:
i = 1
# 进行位运算,只有相同位置的二进制数相同才会大于零,否则返回0
pre = i & n > 0
# 每次将i向左移一位,比较下一个高位
i <<= 1
# 如果i > n说明高位已经超出,这个时候可以不用比较
while i < n:
cur = i & n > 0
# 判断两次结果,异或相同返回False,相异返回True,这里如果相同,则不满足,返回False
if not pre ^ cur: return False
pre, i = cur, i << 1
return True
上面的思路是一位一位的进行比较
如果一个数交替出现,那么将这个数左移一位,那么这个数和原来的数所有的位都是相反的,那说明这个数位上就是01间隔的,此时如果将其进行异或,那么可以得到位上都为1的数。
要判断一个数是不是每位上都为1,只需要加一,那么只有高位为1,低位都为0,那么也就比较出答案了
class Solution:
def hasAlternatingBits(self, n: int) -> bool:
i = n ^ (n >> 1)
return i & (i + 1) == 0