1009 十进制整数的反码(模拟)
发布日期:2021-05-07 21:56:23 浏览次数:18 分类:精选文章

本文共 1557 字,大约阅读时间需要 5 分钟。

1. 问题描述:

每个非负整数 N 都有其二进制表示。例如, 5 可以被表示为二进制 "101",11 可以用二进制 "1011" 表示,依此类推。注意,除 N = 0 外,任何二进制表示中都不含前导零。二进制的反码表示是将每个 1 改为 0 且每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。给你一个十进制数 N,请你返回其二进制表示的反码所对应的十进制整数。

示例 1:

输入:5

输出:2
解释:5 的二进制表示为 "101",其二进制反码为 "010",也就是十进制中的 2 。

示例 2:

输入:7

输出:0
解释:7 的二进制表示为 "111",其二进制反码为 "000",也就是十进制中的 0 。

示例 3:

输入:10

输出:5
解释:10 的二进制表示为 "1010",其二进制反码为 "0101",也就是十进制中的 5 。

提示:

0 <= N < 10^9

本题与 476:https://leetcode-cn.com/problems/number-complement/ 相同

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/complement-of-base-10-integer

2. 思路分析:

① 分析题目可以知道我们模拟整个过程即可,使用循环依次计算十进制数字N对应的二进制数字的每一位并且存储到一个列表中,使用另外一个循环将列表的值取反(与1进行异或操作就可以取反)然后去除列表中的前导0,最后遍历列表计算对应的十进制数字即可

② 因为是取反操作,所以可以知道N与取反之后的数字相加之后等于n,其中n的位数与N的二进制位数相等,并且n的二进制位中每一位都是1,基于这个想法我们可以求解出N对应的二进制位数,然后计算全为1的数值,减去N那么就是最终的结果了

python计算二进制的位数可以使用:(int)math.log(N, 2) + 1,也就是log2N + 1,或者是使用bin函数获取数字N对应的二进制字符串然后len(bin) - 2得到的就是二进制数字的长度

3. 代码如下:

class Solution:    def bitwiseComplement(self, N: int) -> int:        if N == 0: return 1        nums = list()        # 计算十进制数字对应的二进制字符串        while N > 0:            nums.insert(0, N % 2)            N //= 2        for i in range(len(nums)):            # 与1异或相当于是取反            nums[i] ^= 1        j = 0        while j < len(nums):            if nums[j] != 0:                break            else:                j += 1        if j < len(nums):            nums = nums[j:]        res, base = 0, 1        # 逆序遍历        for i in range(len(nums) - 1, -1, -1):            if nums[i] != 0:                res += base            base *= 2        return res

 

上一篇:1335 工作计划的最低难度(动态规划)
下一篇:395 至少有K个重复字符的最长子串(递归)

发表评论

最新留言

很好
[***.229.124.182]2025年03月28日 10时11分30秒