题目:
给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。
示例 1:
输入:n = 5
输出:true
解释:5 的二进制表示是:101
示例 2:
输入:n = 7
输出:false
解释:7 的二进制表示是:111.
示例 3:
输入:n = 11
输出:false
解释:11 的二进制表示是:1011.
示例 4:
输入:n = 10
输出:true
解释:10 的二进制表示是:1010.
示例 5:
输入:n = 3
输出:false
提示:
1 <= n <= 231 - 1
思路一:
分别判断各个二进制位每一位是否相同
最开始的条件是n>0
判断最低位即n%2
相邻位 即为n/2 在n%2即两个位置是否相同
如果相同则为false 如果不同最后返回true
class Solution {
public boolean hasAlternatingBits(int n) {
while (n > 0) {
int pop = n % 2;
n /= 2;
if (pop == n % 2) {
return false;
}
}
return true;
}
}
思路二:
与思路一相同,逐个比较每一位
只不过思路一是通过% 和/进行获取
而思路二为移位
获取最后一位:与1相与
获取相邻一位:移位,在与1相与
判断是否相同,依次遍历
class Solution {
public boolean hasAlternatingBits(int n) {
// 初始化,为 n 的最后一位
int prev = n & 1;
while (n > 0) {
n >>= 1;
int cur = n & 1;
// 当前和上一个相等,返回 false
if (cur == prev) return false;
// 不相等,把 prev 设置当前,用于下一个比较
prev = cur;
}
// 遍历完,都不相等,返回 true
return true;
}
}
思路三:
位运算 思路点 异或 以及如何判断全为1
n与n整体右移一位进行比较异或
如果全是1 即交替二进制
如果其中有0 则不是交替二进制
如何判断是否全为1
即n+1与n进行想与
如果为0 则全为1
class Solution {
public boolean hasAlternatingBits(int n) {
int tmp = n ^ (n >> 1);
return (tmp & (tmp + 1)) == 0;
}
}