• 作者: 负雪明烛
  • id: fuxuemingzhu
  • 个人博客: http://fuxuemingzhu.cn/
  • 公众号:负雪明烛
  • 本文关键词:Leetcode, 力扣,476, 补数,二进制,Python, C++, Java

目录

  • 题目描述
  • 解题方法
    • 方法一:取反
    • 方法二:异或
    • 方法三:二进制字符串
  • 总结
  • 日期

题目地址:https://leetcode.com/problems/number-complement/

  • Difficulty: Easy

题目描述

Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.

Note:

  1. The given integer is guaranteed to fit within the range of a 32-bit signed integer.
  2. You could assume no leading zero bit in the integer’s binary representation.

Example 1:

Input: 5
Output: 2
Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.

Example 2:

Input: 1
Output: 0
Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.

解题方法

今天题目重点是:补数。

补数是对该数的二进制取反。

注意二进制中是没有前导 0 的,也就是说二进制 表示的数字中,第一位必然是 1。

方法一:取反

位运算中有一个运算符 ~ 表示取反,可不可以用它呢?我们实验一下:

>>> Integer.toBinaryString(5)
101
>>> Integer.toBinaryString(~5)
11111111111111111111111111111010

我们看到,虽然 5 的二进制 101 被取反了,但是其前导 0 也被取反。

所以我们不能直接用 ~ 运算符。

下面的思路就是找到数字的二进制中,第一个 1 的位置了。

对于 Java 而言,有库函数可以使用 Integer.highestOneBit(num) ,它的作用是只保留 num 二进制的最高位的 1 的情况下的数字。

>>> Integer.highestOneBit(5)
4

我们想得到和 num 的二进制位置相等的全 1 的数字,可以用 ((Integer.highestOneBit(num)) << 1) - 1

Java 语言的代码如下:

public class Solution {public int findComplement(int num) {return ~num & ((Integer.highestOneBit(num) << 1) - 1);}
}

复杂度分析:

  • 时间复杂度:O(1)O(1)O(1),和数据规模无关;
  • 空间复杂度:O(1)O(1)O(1),只使用了常数个空间。

方法二:异或

注意到求补数,就是把现有的二进制表示各位进行了 0, 1 互换,很容易想到异或操作。

0 ^ 1 = 1
1 ^ 1 = 0

所以我们应该把原本的数字的每一位都和 1 进行异或计算。

我们需要构建和源数字的二进制位数相等的全 1 数字。求源数字的二进制数字长度可以用方法一,也可以直接获取二进制字符串长度。

Python 代码如下:

class Solution:def findComplement(self, num):return num ^ ((1 << (len(bin(num)) - 2)) - 1)


复杂度分析:

  • 时间复杂度:O(1)O(1)O(1),和数据规模无关;
  • 空间复杂度:O(1)O(1)O(1),只使用了常数个空间。

方法三:二进制字符串

另一种常见的思路是先把输入数字 num 转成二进制字符串,将二进制字符串中的 '0''1' 互换,再转成 10 进制数字。

Python 语言的代码如下:

class Solution:def findComplement(self, num):bin_num = bin(num)[2:]bin_ans = map(lambda x: '0' if x == '1' else '1', bin_num)return int(''.join(bin_ans), 2)

复杂度分析:

  • 时间复杂度:O(1)O(1)O(1),和数据规模无关;
  • 空间复杂度:O(1)O(1)O(1),只使用了常数个空间。

总结

  1. 这个题的重点是获取二进制数字的长度。
  2. 除了上面的方法外,还可以逐位遍历,找到其二进制的第一个 1。

日期

2017 年 1 月 15 日
2018 年 7 月 4 日
2018 年 11 月 6 日 —— 腰酸背痛要废了
2021 年 10 月 18 日

【LeetCode】476. 数字的补数 Number Complement相关推荐

  1. leetcode 476. 数字的补数(Number Complement)

    目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含 ...

  2. Java实现 LeetCode 476 数字的补数

    476. 数字的补数 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 示例 1: 输入: 5 输出: 2 解释: 5 的二进制表示为 101(没有前导零位),其补数为 010.所以你需要 ...

  3. leetcode 476. 数字的补数(Java版)| How to extract ‘k’ bits from a given position in a number

    题目 https://leetcode-cn.com/problems/number-complement/ 思路 我们想要返回已知数字的补数(num>=1). 思路: 获取 num 的二进制数 ...

  4. LeetCode 476. 数字的补数(移位 异或^)

    1. 题目 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 2. 解题 先求出该数的2进制有多少位 然后分别每位与1进行异或操作 class Solution {public:int f ...

  5. [leetcode]476. 数字的补数

    1. class Solution {public:int findComplement(int num) {int res = 0;int t = 0;string s = "" ...

  6. 476. 数字的补数

    476. 数字的补数 给你一个 正 整数 num ,输出它的补数.补数是对该数的二进制表示取反. 例 1:输入:num = 5 输出:2 解释:5 的二进制表示为 101(没有前导零位),其补数为 0 ...

  7. leetcode 476. Number Complement | 476. 数字的补数(位运算)

    题目 https://leetcode.com/problems/number-complement/ 题解 class Solution {public int findComplement(int ...

  8. LeetCode刷题(python)——476. 数字的补数

    题目描述: 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含前导零位. 示例 1: 输入: 5 输出: 2 解 ...

  9. 数的补数 Number Complement

    2019独角兽企业重金招聘Python工程师标准>>> 问题: Given a positive integer, output its complement number. The ...

最新文章

  1. ubuntu18安装virtualbox
  2. movsb movsw movsd 指令详解
  3. ubuntu创建文件夹快捷方式命令
  4. ug导出step文件失败_解决UG导出CAD图纸失败的问题
  5. 日志管理(一):slf4j原理简单介绍
  6. java xml获取属性值_java – 如何获取具体属性值的特定XML元素?
  7. Java连接PostgreSQL数据库,增删改查
  8. 树——通用树到二叉树的转换
  9. cron表达式 每天0点10分和30分_揭开考研阅卷的内幕,注意这些多得20分!
  10. 菜鸟学SQLServer--恢复模式
  11. 小技巧处理div内容溢出
  12. 软件开发之韵:和谐敏捷
  13. CSDN账号被盗了吗?
  14. u盘插在电脑上灯亮没有反应_U盘插入电脑指示灯一直闪烁却不显示的解决方法...
  15. mysql 二级什么意思_二级数据库是什么意思
  16. Win10 开启虚拟桌面+投屏
  17. 股票的压力位和支撑位
  18. CPU中的通用寄存器
  19. 什么东西能够改善睡眠,拯救失眠的助眠好物推荐
  20. Android制作圆形背景

热门文章

  1. 专注UI——实用技术:模糊搜索
  2. ZigBee 设置信道、PANID、发射功率
  3. Centos7系或中标麒麟ifconfig/ip addr无法显示ip地址的详细解决方法
  4. 互联网,因特网和万维网的区别是什么?
  5. 读《计算机科学概论》
  6. image、border-image、background-image的区别
  7. 网络爬虫(网络蜘蛛,网络机器人)与Web安全
  8. 如何在CAD中等比例插入光栅图像
  9. element UI 模态层dialog自定义大小
  10. 1-编程基础及Python环境部署