您的位置:首页 > 其它

leetcode-476- Number Complement

2017-01-13 15:10 337 查看

问题

题目:[leetcode-476]

思路

朴素的思路没什么好说的。转化成位向量的形式去做。

代码(位向量)

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: