zl程序教程

您现在的位置是:首页 >  其他

当前栏目

LeetCode-693. 交替位二进制数

2023-09-14 09:01:27 时间

题目描述:

给定一个正整数,检查它的二进制表示是否总是 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;
    }