开启我的LeetCode刷题日记:693. 交替位二进制数

144 阅读1分钟

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

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:693. 交替位二进制数

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

 

示例 1:

输入:n = 5 输出:true 解释:5 的二进制表示是:101 示例 2:

输入:n = 7 输出:false 解释:7 的二进制表示是:111. 示例 3:

输入:n = 11 输出:false 解释:11 的二进制表示是:1011.  

提示:

1 <= n <= 231 - 1

 

我的思路

首先将自身右移一位,然后与自身异或(两个位相同为0,相异为1)。因为要相邻两位数字不相同,如果满足不相同,那么异或后对应的两个位必定相异,结果全部是1。

接下来要判断结果全部是1即可,我们将异或后的结果+1和异或后的结果按位与(两个位都为1时,结果才为1)。当且仅当 a 的二进制表示全为 1 时,结果为 0。当且仅当 a 的二进制表示全为 1 时,a + 1 会产生进位,否则不会产生进位,两个最高位都为 1,相与结果不为 0。

这里举个例子: 5的二进制为101,右移一位得010,进行按位异或,得到111。将111+1,得1000,1000和0111进行按位与,得0。所以5的二进制是交替位的二进制数。 6的二进制为110,右移一位得011,进行按位异或,得到101。将101+1,得110,110和011进行按位与,得010。所以6的二进制不是交替位的二进制数。

代码实现

function hasAlternatingBits(n: number): boolean {
 const a = n ^ (n >> 1);
 return (a & (a+1)) === 0;
};


总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹