问题
思路
朴素的思路没什么好说的。转化成位向量的形式去做。
代码(位向量)
class Solution {
public:
int findComplement(int num) {
int bit[32];
std::memset( bit, 0, sizeof(bit) );
int idx = 0;
while( num ){
bit[idx++] = (num%2)?0:1;
num >>= 1;
}
int ret = 0;
for( int i = 0, base = 1; i < idx; ++i, base*= 2 ){
ret += bit[i]*base;
}
return ret;
}
};
思路
利用mask把每一位取出来,然后用或运算还原回去。这个题有一个注意点,就是mask。当num = INT_MAX的时候,mask再向左移动一位,就会出问题。如果mask有符号数。那么则会上溢,变成负数最小的。因为是高位权0x80000000。判断负数跳出即可,或者写成无符号数也可以。
代码
class Solution {
public:
int findComplement(int num) {
int mask = 1;
int ans = 0;
while( mask > 0 && mask <= num ){
int t = mask & num;
if(!t) ans |= mask;
mask <<= 1;
}
return ans;
}
};