刷题日记-476. 数字的补数

99 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

476. 数字的补数

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= num < 2^31

二、思路分析

基于补数我们知道 101 + 010 = 111 => 010 = 111 ^ 101 所以我们只要知道了111,就可以通过异或来算了。 剩下就是如何根据101来求111了,111 = 2的N次方 - 1. 所以我们可以从1开始,每次左移一位,直到其值大于目标值num,当然也可能32位全1,这个时候值为负数

所以要限制sum > 0, 如果小于0,表示移成了负数,结束循环。

三、AC 代码

class Solution {
    public int findComplement(int num) {
        int sum = 1;
        while(sum <= num && sum > 0) {
            sum = sum << 1; //乘2.
        }

        return (sum - 1) ^ num;
    }
}

范文参考

Python3 简单逻辑运算 91.57%+94.38% - 数字的补数 - 力扣(LeetCode) (leetcode-cn.com)