线切割加工东莞网站建设技术支持常用的英文网站字体
❓693. 交替位二进制数
难度:简单
给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。
示例 1:
输入:n = 5
输出:true
解释:5 的二进制表示是:101
示例 2:
输入:n = 7
输出:false
解释:7 的二进制表示是:111.
示例 3:
输入:n = 11
输出:false
解释:11 的二进制表示是:1011.
提示:
- 1 < = n < = 2 31 − 1 1 <= n <= 2^{31} - 1 1<=n<=231−1
 
💡思路:
基础知识必知:一篇文章搞懂位运算
法一:数学
- 将
n转换成二进制以10结尾的数; - 然后使用数学除法,除以 
4,判断余数的二进制是否为10(对应的十进制为2),如果不是,则不是交替位二进制数,返回false。 
法二:位运算
对于
1010这种位级表示的数,把它向右移动1位得到101,这两个数每个位都不同,因此异或得到的结果为1111。
-  
对输入
n的二进制表示右移一位后,得到的数字再与n按位异或得到a。- 当且仅当输入 
n为交替位二进制数时,a的二进制表示全为111(不包括前导000)。 
 - 当且仅当输入 
 -  
将
a与a+1按位与,当且仅当a的二进制表示全为1时,结果为0。 
结合上述两步,可以判断输入是否为交替位二进制数。
🍁代码:(Java、C++)
法一:数学
 Java
class Solution {public boolean hasAlternatingBits(int n) {if((n & (-n)) == 1) n >>= 1;while(n > 0){if(n % 4 != 2) return false;n /= 4;}return true;}
}
 
C++
class Solution {
public:bool hasAlternatingBits(int n) {if((n & (-n)) == 1) n >>= 1;while(n > 0){if(n % 4 != 2) return false;n /= 4;}return true;}
};
 
法二:位运算
 Java
class Solution {public boolean hasAlternatingBits(int n) {int a = (n ^ (n >>> 1));return (a & (a + 1)) == 0;}
}
 
C++
class Solution {
public:bool hasAlternatingBits(int n) {long a = (n ^ (n >> 1));return (a & (a + 1)) == 0;}
};
 
🚀 运行结果:

🕔 复杂度分析:
- 时间复杂度: O ( 1 ) O(1) O(1),仅使用了常数时间来计算。
 - 空间复杂度: O ( 1 ) O(1) O(1),使用了常数空间来存储中间变量。
 
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!
