leetcode 476 Number Complement

题目来源: 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简直就是绝配!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值