693. 交替位二进制数(位运算:按位与&、异或)

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

每日刷题第75天 2021.03.28

693. 交替位二进制数

题目描述

  • 给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

示例

  • 示例1
输入: n = 5
输出: true
解释: 5 的二进制表示是:101
复制代码
  • 示例2
输入: n = 7
输出: false
解释: 7 的二进制表示是:111.
复制代码

解题思路

相似的题目

常规的模拟

  • 将当前十进制数转换成二进制数后,将其后一位和前一位单独拆分下来,进行比较。 如果两位始终相同,就是符合的交替位二进制数,返回true;反之直接返回false
  • 最初的思路:模运算获得最后一位,没两位作为一组进行比较,如果有一组不符合要求,那么就返回false;反之一直找到最后都没有发现不符合的,则返回true
  • 那么只需要再通过异或运算符判断是否符合
    • 相异异或,1
    • 相同异或,0

后期的优化

  • 每次获取最后一位的数值(0或者1),不需要再使用模运算,可以使用&按位与操作
  • 举例:
    • 111 & 1 = 1
    • 110 & 1 = 0
  • 总结:按位与就是用来判断最后一位是0还是1
  • 在运算速度上,位运算是优于模运算的。

另外一种位运算方法

  • 对输入 n 的二进制表示右移一位后,得到的数字再与 n 按位异或得到 a。当且仅当输入 n 为交替位二进制数时,a 的二进制表示全为 1(不包括前导 0)。这里进行简单证明:当 a 的某一位为 1 时,当且仅当 n 的对应位和其前一位相异。当 a 的每一位为 1 时,当且仅当 n 的所有相邻位相异,即 n 为交替位二进制数。
  • aa + 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)

猜你喜欢

转载自juejin.im/post/7080161038393409544