leetcode 476 Number Complement

来源:互联网 发布:监控器无网络视频 编辑:程序博客网 时间:2024/05/29 14:41
题目来源: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简直就是绝配!

原创粉丝点击