java数据结构与算法刷题-----LeetCode476. 数字的补数

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 位运算:取出非前导0位标1,进行异或
    • 2. 笨办法

在这里插入图片描述

1. 位运算:取出非前导0位标1,进行异或

因为这道题考察的就是求十进制整数的有效数值位反码问题(不是原码,补码,反码那个反码。而是1变0,0变1那个反码),各大编程语言源码实现此功能的经典方法就是这个方法,所以推荐直接理解这个方法。另外还有一道题1009. 十进制整数的反码,也是和这道题完全一样的考题。

解题思路:时间复杂度O( l o g 2 l o g 2 n u m log_2{log_2{num}} log2log2num),空间复杂度O( 1 1 1)
  1. 对整数num的二进制(不操作前导0),全部取反,就是num的补数
  2. 例如5的二进制0000 0000 0000 0000 0000 0000 0000 0101,红色的0都是前导0,求补数时,是不需要取反的。
  3. 5的补数0000 0000 0000 0000 0000 0000 0000 0010,只有黄色的非前导0部分才进行取反
  4. 如果只对010操作的话,我们只需要让其每一位和1异或就可以取反,例如101 ^ 111 = 010
  5. 但是计算机中5的二进制是0000 0000 0000 0000 0000 0000 0000 0101。如果异或1111 1111 1111 1111 1111 1111 1111 1111,会得到1111 1111 1111 1111 1111 1111 1111 1010,这样的话,答案就错了
  6. 如何解决这个问题呢?如果我们能让5的二进制只异或0000 0000 0000 0000 0000 0000 0000 0111的话,就可以得到5的补数0000 0000 0000 0000 0000 0000 0000 0010

所以对于一个数num = 0000 0000 0000 0000 0000 0000 0000 0101,如何能找出只有黄色部分全1,红色部分全0的二进制串t = 0000 0000 0000 0000 0000 0000 0000 0111,就是破题的关键

而针对这个问题,有个很简单的操作方式,就是通过位移操作和或操作配合,对1,2,4,8,16,…的右移结果相或,就可以抛弃前导0,对其余位全部填充1.案例如下:下面的案例是针对32位的int型,所以只需要右移到16.如果是64位的long型,需要右移到32,依此类推。

/** 将num中非前导0的地方都填充为1 **/
//t=num:    0100 0000 0000 0000 0000 0000 0000 0101
//t>>1      0010 0000 0000 0000 0000 0000 0000 0010
//t=t|t>>1  0110 0000 0000 0000 0000 0000 0000 0111
//t>>2      0001 1000 0000 0000 0000 0000 0000 0001
//t=t|t>>2  0111 1000 0000 0000 0000 0000 0000 0111
//t>>4      0000 0111 1000 0000 0000 0000 0000 0000
//t=t|t>>4  0111 1111 1000 0000 0000 0000 0000 0111
//t>>8      0000 0000 0111 1111 1000 0000 0000 0000
//t=t|t>>8  0111 1111 1111 1111 1000 0000 0000 0111
//t>>16     0000 0000 0000 0000 0111 1111 1111 1111
//t=t|t>>16 0111 1111 1111 1111 1111 1111 1111 1111
int t = num;
t = t | (t >> 1);
t |= t >> 2;
t |= t >> 4;
t |= t >> 8;
t |= t >> 16;

有了这个,然后再进行异或操作就完成了这道题目

代码

在这里插入图片描述

class Solution {public int findComplement(int num) {/** 将num中非前导0的地方都填充为1 **///t=num:    0100 0000 0000 0000 0000 0000 0000 0101//t>>1      0010 0000 0000 0000 0000 0000 0000 0010//t=t|t>>1  0110 0000 0000 0000 0000 0000 0000 0111//t>>2      0001 1000 0000 0000 0000 0000 0000 0001//t=t|t>>2  0111 1000 0000 0000 0000 0000 0000 0111//t>>4      0000 0111 1000 0000 0000 0000 0000 0000//t=t|t>>4  0111 1111 1000 0000 0000 0000 0000 0111//t>>8      0000 0000 0111 1111 1000 0000 0000 0000//t=t|t>>8  0111 1111 1111 1111 1000 0000 0000 0111//t>>16     0000 0000 0000 0000 0111 1111 1111 1111//t=t|t>>16 0111 1111 1111 1111 1111 1111 1111 1111int t = num;t = t | (t >> 1);t |= t >> 2;t |= t >> 4;t |= t >> 8;t |= t >> 16;//num:      0100 0000 0000 0000 0000 0000 0000 0101//t:        0111 1111 1111 1111 1111 1111 1111 1111//num ^ t   0011 1111 1111 1111 1111 1111 1111 1010return num ^ t;}
}

2. 笨办法

解题思路:时间复杂度O( l o g 2 n u m log_2 num log2num),空间复杂度O( 1 1 1)
  1. 用循环位移操作,找到最高位的1,属于暴力找位置的笨办法,也是Leetcode官方题解给出的方法,毕竟是官方解法,需要同时照顾老手和新手,推荐学有余力的同学直接掌握方法1。因为这个方法2会有溢出的风险。而方法1是各大编程语言源码中也使用的方法。
  2. 然后通过-1操作,生成除了前导0,全是1的二进制串
  3. 其思路和法1一样,但是需要自己循环找最高位,然后通过-1操作得到目标二进制串。具体看代码注释
代码

在这里插入图片描述

class Solution {public int findComplement(int num) {int highbit = 0;//找到比num最高位高的,第一位。例如num = 0101的最高为是2位置的[3位置,2位置,1位置,0位置], highbit = 1000的1的位置为3位置,正好比num的最高位高一位//找这个比num最高位的1高一位的1for (int i = 1; i <= 30; ++i) {if (num >= (1 << i)) {//如果num还是比highbit大,说明没找到,继续找highbit = i;} else {//如果num比highbit小break;//找到了,跳出循环}            }//对highbit位进行 - 1,找到全是1的低位。例如二进制1000 - 1 = 0111//但是如果highbit正好30位,则会进行溢出。直接赋值0111 1111 1111 1111 1111 1111 1111 1111//如果小于30位,我们就获取其二进制,然后-1.int mask = highbit == 30 ? 0x7fffffff : (1 << (highbit + 1)) - 1;return num ^ mask;//最后进行异或操作}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/619136.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串常量池(StringTable)

目录 String的基本特性 String的内存分配 字符串拼接操作 intern()的使用 String的基本特性 String&#xff1a;字符串&#xff0c;使用一对""引起来表示 String声明为final的&#xff0c;不可被继承 String实现了Serializable接口&#xff1a;表示字符串是支持…

BetterZip解锁文件处理新境界

在数字化时代的浪潮中&#xff0c;文件处理成为了我们日常生活和工作中不可或缺的一部分。压缩软件&#xff0c;作为文件处理的得力助手&#xff0c;以其出色的压缩性能、便捷的操作体验以及强大的文件管理能力&#xff0c;赢得了广大用户的青睐。在众多压缩软件中&#xff0c;…

信息系统项目管理师0051:管理基础(4信息系统管理—4.1管理方法—4.1.1管理基础)

点击查看专栏目录 文章目录 第四章 信息系统管理4.1管理方法4.1.1管理基础1.层次结构2.系统管理第四章 信息系统管理 在信息技术和数据资源要素的推动下,社会各领域已经并正在加速进入数字化的全新发展时期,基于智能、网络和大数据的新经济业态正在形成,从“数字融合”向“数…

webpack-(plugin,本地服务器,路径别名,安装vue)

安装vue npm i vue-loader -D npm i vue 编写一个vue文件&#xff1a; 在index.html中设置 一个id为app的div 将vue文件挂载到app中 vue比较特殊&#xff0c;除了使用loader外&#xff0c;还使用了plugin const path require("path"); const { VueLoaderPlugin …

Spring声明式事务控制

文章目录 1.编程式事务控制相关对象(了解即可)1.1PlarformTransactionManager1.2 TransactionDefinition 2.基于XML的声明式事务控制2.1声明式事务控制的实现 3.基于注解的声明式事务控制 1.编程式事务控制相关对象(了解即可) 1.1PlarformTransactionManager PlatformTransac…

【信号处理】心电信号传统R波检测定位典型方法实现(matlab)

关于 心电信号中QRS波检测是一个非常重要的步骤&#xff0c;可以用于实现重要波群的基本定位&#xff0c;在定位基础上&#xff0c;可以进一步分析心电信号的特征变化&#xff0c;从而为医疗诊断提供必要的参考。 工具 MATLAB ECG心电信号 方法实现 ECG心电信号加载 ecg …

基于Python豆瓣电影数据可视化分析系统的设计与实现

大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现 2024最新项目 项目介绍 本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示&#xff0c;构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据&#xff0c;我们提供了…

机器学习-随机森林温度预测模型优化

文章目录 前言旧模型训练新模型训练参数查看组合参数训练学习模型评估 前言 在机器学习-随机森林算法预测温度一文中&#xff0c;通过增大模型训练数据集和训练特征的方式去优化模型的性能&#xff0c;本文将记录第三方种优化方式&#xff0c;通过调整随机森林创建模型参数的方…

如何安装MacOS的虚拟机?mac安装虚拟机的步骤 虚拟机安装MacOS VMware Fusion和Parallels Desktop19

要在Mac上运行MacOS的虚拟机&#xff0c;常用的方法是使用虚拟化软件如VMware Fusion或Parallels Desktop。 以下是安装MacOS的虚拟机的主要步骤&#xff1a; 1. 检查系统要求&#xff1a;确定您的Mac硬件和操作系统满足安装要求。您需要一台具备足够性能的Mac&#xff0c;并…

Lua脚本使用手册(Redis篇)

Lua脚本 **简介&#xff1a;**Lua是一种功能强大的&#xff0c;高效&#xff0c;轻量级&#xff0c;可嵌入的脚本语言。它是动态类型语言&#xff0c;通过使用基于寄存器的虚拟机解释字节码运行&#xff0c;并具有增量垃圾收集的自动内存管理&#xff0c;是配置&#xff0c;脚…

ASP.NET基于BS的计算机等级考试系统的设计与实现

摘 要 随着计算机技术的发展及计算机的日益普及&#xff0c;基于B/S结构的考试系统与无纸化办公一样已成为大势所趋。论文详细论述了一个基于B/S结构的计算机等级考试系统的设计过程。软件采用ASP.NET 2005作开发平台&#xff0c;C#作编程语言&#xff0c;SQL Server 2005作…

Python进阶编程 --- 2.MySQL、pymysql、PySpark

文章目录 第一章&#xff1a;SQL基础入门1.1 数据库数据库如何存储数据 1.2 数据库和SQL的关系1.3 MySQL版本1.4 命令提示符内使用MySQL1.5 SQL概述1.5.1 SQL语言分类1.5.2 SQL语言特性 1.6 DDL库管理表管理 1.7 DML - 数据操作1.8 DQL - 查询和计算数据1.8.1 基础数据查询1.8.…