Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.
Note:
- The given integer is guaranteed to fit within the range of a 32-bit signed integer.
- You could assume no leading zero bit in the integer’s binary representation.
Example 1:
Input: 5 Output: 2 Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.
Example 2:
Input: 1 Output: 0 Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.
题目大意:给定一个正整数,求其补数。补数的定义是:翻转原数的二进制表示之后得到的数,不考虑原数前面的0。
解题思路:
解法一:不停地对原数进行%2和/2的操作,如果取余结果为0,则加上对应位置的2的整数次方,直到原数变为0。
代码如下:(13ms,beats 29.50%)
public int findComplement(int num) {
int res = 0;
int i = 0;
while (num != 0) {
if ((num & 0x1) == 0) {
res += Math.pow(2, i);
}
i++;
num >>= 1;
}
return res;
}
解法二:一行代码搞定,大意是先将原数取翻,但此时原数左边的若干个0变成了1,我们只取需要的右半部分。其中java.lang.Integer.highestOneBit(int i)返回的是将i的二进制表示中最高非0位右边的所有位都置0所得到的数,例如对5(101)执行该方法返回的就是4(100)。
代码如下:(11ms,beats 64.10%)
public int findComplement(int num) {
return (~num) & ((Integer.highestOneBit(num) << 1) - 1);
}