0
点赞
收藏
分享

微信扫一扫

leetcode:693. 交替位二进制数

693 交替位二进制数

链接: https://leetcode-cn.com/problems/binary-number-with-alternating-bits/

给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

示例 1:

输入:n = 5
输出:true
解释:5 的二进制表示是:101

示例 2:

输入:n = 7
输出:false
解释:7 的二进制表示是:111.

示例 3:

输入:n = 11
输出:false
解释:11 的二进制表示是:1011.

解法

  • 模拟二进制,挨位进行比较;二进制是取余2再除以2,用栈进行保存,再取反就是顺位的二进制顺序;

  • 位运算:对输入 n 的二进制表示右移一位后,得到的数字再与 n 按位异或得到 a。当且仅当输入 n为交替位二进制数时,a 的二进制表示全为 1(不包括前导 0)。这里进行简单证明:当 a的某一位为 1 时,当且仅当 n的对应位和其前一位相异。当 a的每一位为 1 时,当且仅当 n的所有相邻位相异,即 n 为交替位二进制数。

    将 a 与 a+1 按位与,当且仅当 a的二进制表示全为 1 时,结果为 0。这里进行简单证明:当且仅当 a 的二进制表示全为 1 时,a +1 可以进位,并将原最高位置为 0,按位与的结果为 0。否则,不会产生进位,两个最高位都为 1,相与结果不为 0。

模拟实现

  • python实现
class Solution:
    def hasAlternatingBits(self, n: int) -> bool:
        res = []
        length = 0
        while n:
            length += 1
            res.append(n%2)
            n = n // 2
        if length == 1:
            return True
        for i in range(1, length):
            if res[i] == res[i-1]:
                return False
        return True
class Solution:
    def hasAlternatingBits(self, n: int) -> bool:
        prev = 2
        while n:  # 节省空间
            cur = n % 2
            if cur == prev:
                return False
            n = n // 2
            prev = cur
        return True
  • c++实现
class Solution {
public:
    bool hasAlternatingBits(int n) {
        int prev = 2;
        while(n>0)
        {
            int cur = n % 2;
            if(cur == prev)
            {
                return false;
            }
            n = n / 2;
            prev = cur;
        }
        return true;
    }
};

位运算实现:

假如一个数是交替位的形式,比如’1010101’,则右移一位仍然是交替位的形式’101010’, 二者进行异或处理之后得到的结果为’1111111’, 其与自己+1的结果与的结果为’01111111’ & ‘1000000’ 结果为0

  • python实现
class Solution:
    def hasAlternatingBits(self, n: int) -> bool:
        # 位运算, 101010 6 010101
        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 ( n ) O(n) O(n), 二进制法 O ( 1 ) O(1) O(1)
  • 空间复杂度:模拟法 O ( 1 ) O(1) O(1), 二进制法 O ( 1 ) O(1) O(1)
举报

相关推荐

0 条评论