【LeetCode】476. 数字的补数 Number Complement
- 作者: 负雪明烛
- 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:
- The given integer is guaranteed to fit within the range of a 32-bit signed integer.
- 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。
日期
2017 年 1 月 15 日
2018 年 7 月 4 日
2018 年 11 月 6 日 —— 腰酸背痛要废了
2021 年 10 月 18 日
【LeetCode】476. 数字的补数 Number Complement的更多相关文章
- Java实现 LeetCode 476 数字的补数
476. 数字的补数 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 示例 1: 输入: 5 输出: 2 解释: 5 的二进制表示为 101(没有前导零位),其补数为 010.所以你需要 ...
- Leetcode 476.数字的补数
数字的补数 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含前导零位. 示例 1: 输入: 5 输出: 2 解 ...
- [Swift]LeetCode476. 数字的补数 | Number Complement
Given a positive integer, output its complement number. The complement strategy is to flip the bits ...
- 力扣(LeetCode)476. 数字的补数
给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含前导零位. 示例 1: 输入: 5 输出: 2 解释: 5的二 ...
- 小练习:补数 (Number Complement)
1.eamples Input: Output: Explanation: The binary representation of (no leading zero bits), and its c ...
- 【leetcode】476. Number Complement
problem 476. Number Complement solution1: class Solution { public: int findComplement(int num) { //正 ...
- LeetCode#476 Number Complement - in Swift
Given a positive integer, output its complement number. The complement strategy is to flip the bits ...
- LeetCode——Number Complement
LeetCode--Number Complement Question Given a positive integer, output its complement number. The com ...
- C#LeetCode刷题之#136-只出现一次的数字(Single Number)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4046 访问. 给定一个非空整数数组,除了某个元素只出现一次以外, ...
随机推荐
- python—模拟生成双色球号和大乐透号
下边这个脚本,比较适合初级学习基本python语法用.但是,不精炼建议可参考https://www.cnblogs.com/Formulate0303/p/14031748.html的写法. 大乐透玩 ...
- 前端3 — js — BOM没完( 不了解也行 )
1.js是什么? -- 英文全称javascript javaScript(简称"JS") 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言.虽然它是作为开发Web页面的脚 ...
- 学习java的第十七天
一.今日收获 1.java完全学习手册第三章算法的3.1比较值 2.看哔哩哔哩上的教学视频 二.今日问题 1.在第一个最大值程序运行时经常报错. 2.哔哩哔哩教学视频的一些术语不太理解,还需要了解 三 ...
- 论 Erda 的安全之道
作者|陈建锋 来源|尔达 Erda 公众号 软件研发是一个复杂的工程,不仅需要进行软件的设计.开发.测试.运维,还涉及到大量的人力.物力管理.今天讨论的主角 - "安全",在软 ...
- Codeforces Round #754 (Div. 2) C. Dominant Character
题目:Problem - C - Codeforces 如代码,一共有七种情况,注意不要漏掉 "accabba" , "abbacca" 两种情况: 使用 ...
- Linux基础命令---ntpdate网络时间服务器
ntpdate ntpdate指令通过轮询指定为服务器参数的网络时间协议(NTP)服务器来设置本地日期和时间,从而确定正确的时间. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS ...
- display:inline-block,block,inline元素的区别
1.display:block将元素显示为块级元素,从而可以更好地操控元素的宽高,以及内外边距,每一个块级元素都是从新的一行开始.2.display : inline将元素显示为行内元素,高度,行高以 ...
- Android 高级UI组件(一)GridView与ListView
1.GridView 1.GridView学习 GridView和ListView都是比较常用的多控件布局,而GridView更是实现九宫图的首选 main.xml: <?xml version ...
- GO Exit Fatal panic
Exit() 应用程序(不只是函数)退出执行 defer 不会被执行(因为程序都退出了) log.Fatal() 输出打印内容 应用程序退出 defer 不会被执行 panic() 函数停止执行(不是 ...
- python web框架学习笔记
一.web框架本质 1.基于socket,自己处理请求 #!/usr/bin/env python3 #coding:utf8 import socket def handle_request(cli ...