「每日LeetCode」2021年1月29日

本文最后更新于:2023年3月19日 晚上

Lt693. 交替位二进制数

693. 交替位二进制数

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

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

示例 2:

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

示例 3:

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

示例 4:

1
2
3
输入:n = 10
输出:true
解释:10 的二进制表示是:1010.

示例 5:

1
2
输入:n = 3
输出:false

提示:

  • 1 <= n <= 2 - 1

思路

字符串

转为二进制字符串以后判断每一位是否与上一位相同

位运算

将原数字和原数字向右移动一位的数进行抑或,如果为交替出现 01 的二进制,此时得到的数应该为 0 开头剩余都为 1 的二进制数。
将得到的数加一可以得到 1 开头剩余都为 0 的二进制数,两个数相与得到的数为 0。

解答

字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* @param {number} n
* @return {boolean}
*/
var hasAlternatingBits = function (n) {
n = n.toString(2).split("");
let prev;
let flag = true;
for (const num of n) {
if (num === prev) return false;
prev = num;
}
return true;
};

位运算

1
2
3
4
5
6
7
8
/**
* @param {number} n
* @return {boolean}
*/
var hasAlternatingBits = function (n) {
const m = n ^ (n >> 1);
return (m & (m + 1)) == 0;
};