题目: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.
题意:给定一个整数M,输出其补数N,N的二进制表示的每一位为M的二进制表示的每一位的取反。即:1变为0,0变为1。
思路一:将M用其二进制表示,遍历每一位,若该位为1,则改为0;若该位为0,则改为1。
代码:
class Solution {
public int findComplement(int num) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
map.put(1,0);
map.put(0,1);
String s = Integer.toBinaryString(num);
char[] cs = s.toCharArray();
int value = 0, length = cs.length-1;
for(char c:cs){
int m = Character.getNumericValue(c);
int n = map.get(m);
value = (int)(value + n*Math.pow(2,length));
length--;
}
return value;
}
}
时间:13ms
思路二:构造一个和M的二进制长度一样的掩码,该掩码的每一位都为1,令该掩码与M进行异或。
代码:
class Solution {
public int findComplement(int num) {
int mask = 1, temp = num;
while(temp != 0){
mask = mask << 1;
temp = temp >> 1;
}
return num^(mask-1);
}
}
注意:mask左移一次相当于乘以2,temp右移一次相当于除以2。mask必须要减1,最终的二进制表示才为11111….11111。