Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
对整数的二进制表示取反(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 < 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)