题目描述:
给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。
解题思路一:先把n转为2进制数(有一个模板可以看看解题思路三)若有相邻的两位相等的话,可以直接返回false,否则返回true;
class Solution {
public:
string binaryNum(int n){//n=5;
string s;
string s1="01";
while(n>0){
int x=n%2;
s=s1[x]+s;//一:1+"" 二:0+"1" 三:1+"01"
n/=2;
}
return s;
}
bool hasAlternatingBits(int n) {
string s=binaryNum(n);
int i=1;
int m=s.size();
if(n<=1){
return true;
}else{
while(s[i]!='\0'){
if(s[i]!=s[i-1]) ++i;
else return false;
}
}
return true;
}
};
解题思路二:两行代码流???//判断括号尽量别省略
C++中^运算是求异或的:同0异1
若n中二进制每位均不同,则n与n右移一位异或得全1;如:5
原来的n:101
右移的n1:010
结果的n2:111
得到n2后,n2加1便得1000,他俩且运算便得全0;
否则n不满足条件;
bool hasAlternatingBits(int n) {
n = (n ^ (n >> 1));
return (n & ((long)n + 1)) == 0;
}
解题思路三:十进制数转为其他进制数如m进制
每次取最低位,求余是为了得到最低位的数
除是为了右移一位,因为上面已经得到了最低一位数
string binaryNum(int n){//n=5;
string s;
string s1="0123456789abcdef";
while(n>0){
int x=n%m;
s=s1[x]+s;//一:1+"" 二:0+"1" 三:1+"01"
n/=2;
}
return s;
}