leetcode-476- Number Complement

本文介绍了 LeetCode 上第 476 题的两种解决方案,一种是通过位向量的方式求解,另一种是利用 mask 进行位操作的方法。文章提供了详细的代码实现及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

题目:[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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值