题目来源:
LeetCode 476
简单题目分析:
把一个数取反。但是,肯定不是直接用~操作,因为这样会把最高位1之前的前缀0也取反,因此我们所需要做的就是找到最高位1所在的位置,下面附上我的代码:
int findComplement(int num)
{
int iThBite=0; //记录最高位1的位数
int ans=num,temp,i;
while(num)
{
temp=num; //这里用到了x&(x-1)的技巧,最后temp的二进制一定表示为00000x0000,其中x是原num中最高位的1
num&=(num-1); //一开始这里的&让我写成^操作了,一直RE...
if(!num)
break;
}
while(temp)
{
temp>>=1;
iThBite++;
}
iThBite--; //这里把iThBite减1是为了下面取反第n位方便,因为位数从0开始计数
for(i=0;i<=iThBite;++i)
ans=ans^(1<<i); //依次把最高位以下的位取反,注意将第n位(从0开始计数)取反的操作
return ans;
}
写完之后感觉自己的代码太难看了...一点也不简洁,leetcode上的代码必然是优美简单的,于是乎我看了看讨论区,里面的黑科技不要太多...附上两个代码:
class Solution {
public:
int findComplement(int num) {
unsigned mask = ~0;
while (num & mask) mask <<= 1;
return ~mask & ~num;
}
};
另外一个是python的:
class Solution(object):
def findComplement(self, num):
i = 1
while i <= num:
i = i << 1
return (i - 1) ^ num
日常赞颂python,感觉python与leetcode简直就是绝配!