力扣476(java)-数字的补数(简单)
题目:
对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。
例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2 。
给你一个整数 num ,输出它的补数。
示例 1:
输入:num = 5
输出:2
解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。
示例 2:
输入:num = 1
输出:0
解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。
提示:
- 1 <= num < 231
注意:本题与 1009 https://leetcode-cn.com/problems/complement-of-base-10-integer/ 相同
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-complement
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
找到给定数字num的二进制中最高位的1,将最高位的1所在位置以及比它低的位置全变为1,再与原数字进行异或运算即可得到答案。
1.【找到最高位的1】:从低位到高位开始找,每找到一个1,就把它变为0,直至num = 0时,当前的1就是最高位上的1;
2.【变1】:将最高位的1左移1位,再减去1,就可以得到最高位的1所在位置以及比它低的位置全变为1;
3.【与原数异或】
例如:9,二进制为:00..1001(32位)
第一次找到的1就是00..0001,把它变成0后的数字就变成了00..1000,然后找到第二个1就是00..1000,把它变成0后数字就变成了00..0000,故要找的最高位的1就是00..1000,然后把这个数字左移一位变成00..10000,再减去1得00..01111,然后再与00..1001进行异或运算得到的00..00110,即为6。
2个经典位运算:
-x :表示所有位置取反加1;
&:按位与,两个都是 1 的时候结果为1,否则结果为0;
x & (-x):保留二进制下最后出现的1的位置,其余位置置0;例如上面的第二个1(00..1000)
x & (x -1):清除二进制下最后出现1的位置的数字,其余位置保持不变;例如将00..1000变为00..0000以此来判断是否为最高位上的1
1 class Solution {
2 public int findComplement(int num) {
3 int maxbit = 1;
4 int x = num;
5 while(x != 0){
6 //找最右边第一位1
7 maxbit = x & (-x);
8 x = x & (x -1);
9 }
10 return num ^ ((maxbit << 1) - 1);
11
12 }
13 }

力扣476(java)-数字的补数(简单)的更多相关文章
- Java实现 LeetCode 476 数字的补数
476. 数字的补数 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 示例 1: 输入: 5 输出: 2 解释: 5 的二进制表示为 101(没有前导零位),其补数为 010.所以你需要 ...
- 【LeetCode】476. 数字的补数 Number Complement
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,476, 补数,二进制,Pyth ...
- 力扣Leetcode 面试题56 - I. 数组中数字出现的次数
面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...
- 力扣485. 最大连续1的个数-C语言实现-简单题
题目 [题目传送门] 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3 ...
- 力扣566. 重塑矩阵-C语言实现-简单题
题目 传送门 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要 ...
- 力扣832. 翻转图像-C语言实现-简单题
题目 传送门 文本 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- Leetcode 476.数字的补数
数字的补数 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含前导零位. 示例 1: 输入: 5 输出: 2 解 ...
- 力扣——single number (只出现一次的数字) python实现
题目描述: 中文: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 英 ...
- 力扣——single number 2(只出现一次的数字 2) python实现
题目描述: 中文: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? ...
随机推荐
- SpringBoot+内置Tomcat配置,参数调优,最大并发量,最大连接数
最近在研究这块的信息,记录下一些大神的文章: SpringBoot 最大连接数及最大并发数是多少???https://blog.csdn.net/weixin_44421461/article/det ...
- day06-Java流程控制
Java流程控制 1.用户交互Scanner java.util.Scanner是Java5的新特征,我们可以通过Scannner类来获取用户的输入. 基本语法: Scanner s = new Sc ...
- js实现回调功能实例
所谓js回调,本人认为无非就是一个函数的参数是另外一个函数,而作为参数的函数就称之为回调函数 <script type="text/javascript"> //要请 ...
- Women forum两周年有感
今天是个高兴的日子,Women forum两周年庆. 当Nicole上台分享了她当妈妈的经历时,我感动得要哭了,导致轮到我上台演讲的时候,还沉浸在那种情绪中,导致我脱稿演讲了,于是我就超时了,实在是抱 ...
- 重返ubuntu世界
一直对"重返"两个字充满了情怀感,因为会想起小时候看的一本龙珠同人的标题,它就唤作<重回龙珠世界>.最近这五年基本都是在MacOS下工作和学习的,也习惯用MacOS.就 ...
- Prompt工程全攻略:15+Prompt框架一网打尽(BROKE、COAST、LangGPT)、学会提示词让大模型更高效
Prompt工程全攻略:15+Prompt框架一网打尽(BROKE.COAST.LangGPT).学会提示词让大模型更高效 0.相关文章推荐 更多Prompt框架技术细节和原理见相关文章 Prompt ...
- 【JVM】关于JVM,你需要知道这些!!
写在前面 最近,一直有小伙伴让我整理下关于JVM的知识,经过十几天的收集与整理,初版算是整理出来了.希望对大家有所帮助. JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境. Java ...
- 使用Dockerfile部署springboot打包jar包
1.docker下载JDK1.8镜像 docker pull java:8 2.进行需要编译的镜像文件目录编写Dockerfile文件 #依赖的父镜像FROM java:8#作者MAINTAINER ...
- C++中std::function常见用法
C++标准库中的std::function是一个通用的函数封装,可以用来存储.复制.调用任何可调用对象(函数.函数指针.成员函数指针.lambda表达式等).以下是std::function的一些常见 ...
- S7Comm报文详解
S7协议是西门子公司为其S7系列PLC(可编程逻辑控制器)通信而设计的一种专用协议.S7协议主要用于西门子PLC之间的通信,以及PLC与其他设备的通信.该协议支持多种通信方式,如MPI(多点接口).P ...