693. Binary Number with Alternating Bits

梦想的初衷 提交于 2020-01-23 02:22:16

693. 交替位二进制数

给定一个正整数,检查他是否为交替位二进制数:换句话说,就是他的二进制数相邻的两个位数永不相等。

示例 1:

输入: 5
输出: True
解释:
5的二进制数是: 101

示例 2:

输入: 7
输出: False
解释:
7的二进制数是: 111

示例 3:

输入: 11
输出: False
解释:
11的二进制数是: 1011

 示例 4:

输入: 10
输出: True
解释:
10的二进制数是: 1010

解法一

//时间复杂度O(logn), 空间复杂度O(1)
class Solution {
public:
    bool hasAlternatingBits(int n) {
        int flag = (n & 1);//0 or 1
        while(n > 0) {
            if(flag != (n & 1)) return false;
            flag = !flag;
            n >>= 1;
        }
        return true;
    }
};

解法二

//时间复杂度O(1), 空间复杂度O(1)
class Solution {
public:
    bool hasAlternatingBits(int n) {// n ^ (n >> 1) 等于0...1111时,true
        int t = exp2((int)log2(n));
        return ( n ^ (n >> 1) ) == ( t | (t - 1) );
    }
};

思路:

解法一

按照题意,依次检查每个位是否是交替位,不是则返回false。

解法二

使用按位异或运算符^,如果它是交替二进制位的数字, n ^ (n >> 1)应该是0...001111.1111的形式(从n最高位起,该位及其右所有位为1)。例如n为5时(为了方便书写,假设n是8位整数,32位同理):

    n            0000 0101
    n>>1         0000 0010
    n^(n>>1)     0000 0111

那为了检查n^(n>>1)是否是00000111,需要构造一个t,这个t只有n的最高位为1,其余位都为0

t = exp2((int)log2(n));

n为5时,t等于0000 0100。则n=5时,下列表达式为0000 0111:

t | (t - 1)

t | (t - 1)表示,从n最高位开始,最高位及右边所有位都为1。可以用它来检查n ^ (n >> 1)。返回二者是否相等。

2019/06/22 18:16
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!