您的位置:首页 > 其它

LeetCode 476. Number Complement

2017-01-16 13:08 232 查看

476. Number Complement

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

给了一个32位的int型数,要求得到他的无前导0的二进制表示下的补码

说真的这样的题目颇有ICS lab的风范,各种只能用位运算解题什么的QAQ

幸运的是这道题目不要求只能用位运算,所以就有了行数多一些的好想一些的解法啦

class Solution
{
public:
int findComplement(int num)
{
unsigned int mask1=1<<31;
while ((mask1&num)==0) mask1>>=1;

//mask1 shows the highest bit of 1

//mask2==mask3 shows a number with 1's from mask to lowbit

unsigned int mask3=(mask1<<1)-1;

//another version
//unsigned int mask2=0;
//while (mask1!=0)
//{
//    mask2+=mask1;
//    mask1>>=1;
//}

return mask3-num;
}
};

我们可以看到,我的思路还是很质朴的。先求出最高位的0在哪里(这里我用了一个朴素的循环),然后找到了最高位的0之后得到了一串只有所有低位有1的掩码mask,然后用mask-num就像是对num的低位取反高位不变,就能得到结果啦

上面有两种算法。我先用的是mask3这样的算法,跑了时间是3ms。看到有人是0ms的就想着优化一下,于是有了mask2那样求掩码的方法,结果变成了6ms!!天知道为什么的情况下我辗转反侧各种对比研究,最后发现两种应该都是3ms。至于我为什么刷出了6ms的解鬼知道23333
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: