Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
每日刷题第75天 2021.03.28
693. 交替位二进制数
- leetcode原题链接:leetcode-cn.com/problems/bi…
- 难度:简单
- 方法:位运算
题目描述
- 给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。
示例
- 示例1
输入: n = 5
输出: true
解释: 5 的二进制表示是:101
复制代码
- 示例2
输入: n = 7
输出: false
解释: 7 的二进制表示是:111.
复制代码
解题思路
相似的题目
常规的模拟
- 将当前十进制数转换成二进制数后,将其后一位和前一位单独拆分下来,进行比较。 如果两位始终相同,就是符合的交替位二进制数,返回
true
;反之直接返回false
- 最初的思路:模运算获得最后一位,没两位作为一组进行比较,如果有一组不符合要求,那么就返回
false
;反之一直找到最后都没有发现不符合的,则返回true
- 那么只需要再通过异或运算符判断是否符合
- 相异异或,1
- 相同异或,0
后期的优化
- 每次获取最后一位的数值(
0或者1
),不需要再使用模运算,可以使用&
按位与操作 - 举例:
111 & 1
= 1110 & 1
= 0
- 总结:按位与就是用来判断最后一位是
0还是1
的 - 在运算速度上,位运算是优于模运算的。
另外一种位运算方法
- 对输入
n
的二进制表示右移一位后,得到的数字再与n
按位异或得到a
。当且仅当输入n
为交替位二进制数时,a
的二进制表示全为1
(不包括前导0
)。这里进行简单证明:当a
的某一位为1
时,当且仅当n
的对应位和其前一位相异。当a
的每一位为1
时,当且仅当n
的所有相邻位相异,即n
为交替位二进制数。 - 将
a
与a + 1
按位与,当且仅当a
的二进制表示全为1
时,结果为0
。这里进行简单证明:当且仅当a
的二进制表示全为1
时,a + 1
可以进位,并将原最高位置为0
,按位与的结果为0
。否则,不会产生进位,两个最高位都为1
,相与结果不为0
。结合上述两步,可以判断输入是否为交替位二进制数。
AC
代码
var hasAlternatingBits = function(n) {
let contra = n % 2;
n = n >> 1;
while(n) {
let wei = n % 2;
if(!((wei) ^ contra)){
return false;
}
// console.log('contra:', contra)
contra = wei;
n = n >> 1;
}
return true;
};
复制代码
新的位运算解法
var hasAlternatingBits = function(n) {
const a = n ^ (n >> 1);
return (a & (a + 1)) === 0;
};
复制代码
总结
- 移位运算符在本质上,是快于
n / 2
的- 移位运算符 =
parseInt(n / 2)
- 移位运算符 =