AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

LeetCode 476. Number Complement    原题链接    简单

作者: 作者的头像   wzc1995 ,  2018-07-01 18:53:41 ,  所有人可见 ,  阅读 1743


6


4

题目描述

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。

样例

输入: 5
输出: 2
解释: 5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2。
输入: 1
输出: 0
解释: 1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0。

说明

  • 给定的整数保证在 32 位带符号整数的范围内。
  • 你可以假定二进制数不包含前导零位。
  • 本题与 1009 相同。

算法

(位运算) $O(\log n)$
  1. 此题的核心在于求出该数最高位 1 所代表的值,假设最高位的 1 在第 t 位上,则设 tot = 1 << t。最后答案为 num 取反,然后取后 t - 1 位,即按位与上 tot - 1。
  2. 可以采用枚举数位的方式,但题解中采用了求 lowbit 的方式。
  3. 注意特判输入为 0 的情况。

时间复杂度

  • 最坏情况下需要遍历这个数的所有二进制位,故时间复杂度为 $O(\log n)$。

空间复杂度

  • 仅需要常数的额外空间。

C++ 代码

class Solution {
public:
    int findComplement(int num) {
        if (!num) return 1;

        int tot = 0;
        for (int x = num; x; x -= x & -x)
            tot = x;

        return ~num & (tot - 1);
    }
};

12 评论


用户头像
贺谦   2020-05-15 12:23         踩      回复

大佬,为什么时间复杂度是O(logn)呀?

用户头像
wzc1995   2020-05-15 12:33         踩      回复

最坏情况是二进制位上全是 1,这时候 lowbit 会遍历所有的二进制位

用户头像
贺谦   2020-05-15 12:36    回复了 wzc1995 的评论         踩      回复

恩,那大佬像我是枚举数位,从0~31位挨个枚举,时间复杂度就是O(n)的吧。

用户头像
wzc1995   2020-05-15 12:37    回复了 贺谦 的评论         踩      回复

这样也是 $O(\log n)$ 的,只不过每次都需要 32 次遍历,常数会大。

用户头像
贺谦   2020-05-15 14:13    回复了 wzc1995 的评论         踩      回复

大佬,按位与的意思是不是这样——
假如num是5,~num就是-6,然后tot - 1是3。
~num的每一位和3进行&操作?

用户头像
wzc1995   2020-05-15 23:58    回复了 贺谦 的评论         踩      回复

对滴


用户头像
wt   2019-05-28 10:14         踩      回复

大神能稍微解释一下吗

用户头像
wzc1995   2019-05-28 10:45         踩      回复

lowbit 是树状数组中的一个基本操作,其核心是让 x 按位与 -x,其中 -x 就是 x 所有位取反然后加 1。你可以手动试几个数字,理解一下 lowbit 操作。

用户头像
wt   2019-05-28 11:00    回复了 wzc1995 的评论         踩      回复

谢谢大佬回复!


用户头像
errorer   2019-01-08 16:34         踩      回复

做完上一个异或的题目,这个题目直接思路就是异或同样位数bit的1就可以了,感觉也不错hh


用户头像
小雨   2018-09-27 12:25         踩      回复

相对于1左移的方法,感觉这个比较intuition


用户头像
小雨   2018-09-27 12:14         踩      回复

为什么喜欢用lowbits的做法呢?


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息