LeetCode: 476.数字的补数

104 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

476.数字的补数

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/nu…

对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。

例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2 。 给你一个整数 num ,输出它的补数。

示例 1:

输入:num = 5 输出:2 解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。

示例 2:

输入:num = 1 输出:0 解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。

提示:

  • 1<=num<2311 <= num < 2^{31}

解法

  • 方法1: 使用自带的函数bin转化成二进制后,进行取反操作
  • python
class Solution:
    def findComplement(self, num: int) -> int:
        num_b = bin(num)[2:]
        new_b = ''
        new_b = ''.join(['0' if i == '1' else '1' for i in num_b])
        return int(new_b, 2)  # 转换为10进制
  • 方法2:位运算,原数 补数有一定的关系,二者之和恰好是位数的全1二进制 在这里插入图片描述

  • python

class Solution:
    def bitwiseComplement(self, n: int) -> int:
        if n == 0:
            return 1
        mask = 1
        while 1:
            if n >= mask:
                mask = mask * 2
            else:
            	# return mask - n - 1
                break
        return n ^ (mask-1)
  • c++
class Solution {
public:
    int findComplement(int num) {
        long mask = 1;
        while(1)
        {
            if(num >= mask)
            {
                mask = mask * 2;
            }
            else
            {
                // return mask-1-num;
                break;
            }
        }
        return num ^ (mask-1);
    }
};

复杂度分析

  • 时间复杂度:O(log n)

  • 空间复杂度:O(1)