【算法题】2 的 n 次幂的背后
前言: 说实话,真的不爱写算法题相关的文章了,觉得没啥意义,但是对这种比较好玩并且简单,学会了就能很好提高算法效率的文章,还是要写一写,不哭不哭,你不会不是你的错,只是因为你懒,学会了就好了,加油!!
一、2 的 n 次幂的特点
我们先看看 2 的 n 次幂都有什么 ?
n | 2 的 n 次幂 | 二进制表示 |
---|---|---|
1 | 2 | 10 |
2 | 4 | 100 |
3 | 8 | 1000 |
4 | 16 | 10000 |
… | … | … |
通过观察,我们可以得出,2 的 n 次幂的二进制表示只有最高位是 1, 其余位都是 0,这也是 2 的 n 次幂的特点 。
二、如何判断某个数 x 是否是 2 的 n 次幂
1. 暴力法
对 x 一直除 2 取余数 % , 看看最后当 x == 0 时,余数是否为 0 ,若是为 0 ,说明其是 2 的 n 次幂
2. 利用 2 的 n 次幂的二进制特点
2 的 n 次幂的二进制表示只有最高位为 1,其余位都为 0。因此,我们对其减 1 得到的结果的二进制表示只有原二进制最高位为 0, 其余位都为 1。如下表所示:
n | 2 的 n 次幂 (x) | 二进制表示 | (x-1) 的二进制表示 | x & (x-1) |
---|---|---|---|---|
1 | 2 | 10 | 01 | 0 |
2 | 4 | 100 | 011 | 0 |
3 | 8 | 1000 | 0111 | 0 |
4 | 16 | 10000 | 01111 | 0 |
… | … | … | … | 0 |
因此,我们将 该数字 x 按位与 (x - 1),若是结果为 0 ,说明该数字是 2 的 n 次幂
Java 代码表示如下:
if((x & (x-1)) == 0){// 说明是 2 的幂次return true;}
三、如何找到距离某个数最近的 2 的 n 次幂
1. 暴力法
排除 , 我们就不使用暴力法,就不用,就不用 ~~
2. 重点:以数字的二进制形式进行思考
以数字 5 为例,距离它最近的2的幂次,比5大的有一个,比5小的有一个,5 的二进制表示为 101。
因为 2 的幂次只有最高位为 1,那么问题的关键就在于如何消除最低位的 1,消除的方法为 加上最低位 1xx(xx位置为 k 个 0) ,或者减去最低位的 1xx(xx位置为 k 个 0) 。
我们不断进行消除,最后就一定能得到距离 x 的最近的两个 2 的幂次
得到数字 x 的最低位 1xx(xx位置为 k 个 0) 的方法为 : x & (-x)
理解 x & (-x) 之前,我们先恶补一下计算机基础知识:
以 -5 为例:
1. 把这个负数的绝对值转换为二进制,即求原码 (101)
2. 把原码取反,即求反码 (11111111111111111111111111111010)
3. 把反码加1,即求补码 (11111111111111111111111111111011)
所以, 5 & -5 = 1
解释: 通过上述变化 -5 只有最低位的 1xx(xx位置为 k 个 0) 和 5相同,其余位都变得和 5 不同(即被取反了)
3. 寻找最近位置完整代码
// 得到小于 n 的距离 n 最近的 2 的幂次public int getMinDistance(int n){// 直接就是 2 的 n 次幂if((n & (n - 1)) == 0){return n;}// 最低位的 1int lb = n & (-n);// 我们要通过不断加上减去最低位1,来消除低位的1,从而得到只有最高位为1的2的幂次// 但是我们要的是距离n最近的小于n的幂次,因此取两者的最小值return Math.min(getMinDistance(n + lb), getMinDistance(n - lb));}// 得到大于 n 的距离 n 最近的 2 的幂次public int getMaxDistance(int n){// 直接就是 2 的 n 次幂if((n & (n - 1)) == 0){return n;}// 最低位的 1int lb = n & (-n);// 我们要通过不断加上减去最低位1,来消除低位的1,从而得到只有最高位为1的2的幂次// 但是我们要的是距离n最近的大于n的幂次,因此取两者的最大值return Math.max(getMinDistance(n + lb), getMinDistance(n - lb));}
我们在对上面代码得到的结果,进行一个距离绝对值的判断,就能得到我们要的结果了
纠错: 需要这么绕嘛?
当然不需要,在实际实现时,我们只需要找到 x 的最高位 1 的位置,然后进行两次 1 的左移操作就行了。 (以 5 为例子, 1 << 2 (距离最近的小于 5 的位置),1 << 3 (距离最近的大于 5 的位置))
为了下一道题铺垫才这么做的 (试图为自己被绕进去了找借口,wwwww)
四、如何通过不断加减 2 的 n 次幂使得某个数最终结果为 0,最少操作次数
通过上面的分析,我们可以轻松得出这道综合题的完整代码,如下:
class Solution {// 6365. 将整数减少到零需要的最少操作数// 操作依据 —— 找到距离目标值最近的2的n次幂public int minOperations(int n) {return dfs(n);}public int dfs(int n){// 说明是 2 的幂次if((n & (n-1)) == 0){// 说明是 2 的幂次,最后再处理一次,即减去这个数字return 1;}int lb = n & (-n);// 操作次数 + 1,然后递归得到的新的数字return 1 + Math.min(dfs(n + lb), dfs(n - lb));}
}
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
【算法题】2 的 n 次幂的背后
前言: 说实话,真的不爱写算法题相关的文章了,觉得没啥意义,但是对这种比较好玩并且简单,学会了就能很好提高算法效率的文章,还是要写一写,不哭不哭,你不会不是你的错,只是…...
![](https://www.ngui.cc/images/no-images.jpg)
【人工智能AI】一、NoSQL 企业级基础入门《NoSQL 企业级基础入门与进阶实战》
写一篇介绍什么是NoSQL的技术文章,分5个章节,每个章节细分到3级目录,重点介绍一下优缺点,适用场景,未来发展趋势等。 一、NoSQL简介 1.1 什么是NoSQL NoSQL(Not only SQL),意思是“…...
![](https://img-blog.csdnimg.cn/0f5595f6cb1e4be197a2fb8940185c0b.png)
Ubuntu安装opencv库3.4.10,并在cmake工程中引入opencv库
Windows下安装不同,Ubuntu安装OpenCV库时,需要事先安装依赖,而且不同OpenCV库所需的依赖可能会有所不同,下面的依赖亲测 3.4.10 和 4.5.5版本的有效,但是4.6以上版本安装可能会报错。 参考链接:https://bl…...
![](https://img-blog.csdnimg.cn/38cfe37407924b50ac66331b4d797796.png)
实现8086虚拟机(四)——mov 和 jmp 指令解码
文章目录mov 指令解码jmp 指令解码这篇文章举例来讲讲 mov 指令和 jmp 指令解码函数的实现,其他的指令解码函数都与这些类似。mov 指令解码 以 mov 指令中的一类:寄存器/内存 到/从 寄存器,来详细说明解码函数的实现。 机器指令格式如下&am…...
![](https://img-blog.csdnimg.cn/dec3b75aa19a476999b835fb4cc4b360.png)
数据库技术-函数依赖、键与约束、范式
一、函数依赖 给定一个x,能唯一确定一个Y,就称x确定Y,或者说Y依赖于x,例如YX*X函数。 函数依赖又可扩展以下两种规则: 部分函数依赖:A可确定C,(A,B)也可确定C,(A,B)中的一部分(即A)可以确定C&a…...
![](https://img-blog.csdnimg.cn/81e31e8ecb5e45b382b21d835d7ef587.png)
shiro CVE-2020-1957
0x00 前言 在之前只是单纯的复现了漏洞,没有记笔记,所以补充了这篇分析笔记。 影响版本:shiro < 1.5.2 0x01 环境搭建 环境用的是:https://github.com/lenve/javaboy-code-samples/tree/master/shiro/shiro-basic 0x02 漏…...
![](https://img-blog.csdnimg.cn/c5614108e1704c60a03591a4e9f870e6.png#pic_center)
RabbitMQ 入门到应用 ( 五 ) 基本应用
6.更多应用 6.1.AmqpAdmin 工具类 可以通过Spring的Autowired 注入 AmqpAdmin 工具类 , 通过这个工具类创建 队列, 交换机及绑定 import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.Di…...
![](https://img-blog.csdnimg.cn/img_convert/a4015666ba468e8465fe7882f22308e2.jpeg)
部署dapr的辛酸历程
前言dapr大概的了解,个人理解他就是一个分布式服务的管理,把微服务常用的组件(缓存,消息中间件、分布式锁、安全id4等)和监控以及服务注册、发现等等一系列功能以一个很抽象的方式管理起来。可能我们部署微服务用consul、ocelot、polly套件、…...
![](https://img-blog.csdnimg.cn/beaa3a7242224e82b48635f257c3386c.png)
golang入门笔记——内存管理
文章目录自动内存管理概念自动内存管理-相关概念:追踪垃圾回收:分代GC(Generational GC)引用计数内存分配Go内存分配-分块Go内存分配——多级缓存Go内存管理优化Balanced GC自动内存管理 概念 1.动态内存 程序在运行时根据需求…...
![](https://www.ngui.cc/images/no-images.jpg)
97. 约数之和
Powered by:NEFU AB-IN Link 文章目录97. 约数之和题意思路代码97. 约数之和 题意 假设现在有两个自然数 A和 B,S是 A^B的所有约数之和。 请你求出 S mod 9901的值是多少。 思路 ABA^BAB的约数之和为:sumAB(1p1p12...p1Ba1)(1p2p22...p2Ba2)...sum_{A^B…...
![](https://www.ngui.cc/images/no-images.jpg)
想和20岁的自己说
男生床头千万不要放卫生纸不要叫自己的女朋友早睡,更不能叫她早起,否则有你好受的。成年人的默契:和异性单独出去旅游,如果没有明确拒绝开一间房,那基本上默认后面会发生的事情不要去考验人性,世上99%的人经…...
![](https://img-blog.csdnimg.cn/456fbaa295e14dfeb024b7a3ba897db7.png)
Unit Test and Integration Test
Unit Test and Integration Test Background It is the first time that I try to write an article in English. In the past, I didn’t write test code. Just thinking QA is responsible for testing. As a developer, I don’t need to care about tests. Although I …...
![](https://img-blog.csdnimg.cn/548f2e576c52434fb738812a0406fb99.png)
2022年全国职业院校技能大赛(中职组)网络安全竞赛试题(3)
目录 模块A 基础设施设置与安全加固 (本模块20分) 一、项目和任务描述: 假定你是某企业的网络安全工程师,对于企业的服务器系统,根据任务要求确保各服务正常运行,并通过综合运用用户安全管理与密码策略、…...
![](https://img-blog.csdnimg.cn/img_convert/49690a20f3de0bf376a465c8b392f85a.jpeg)
智慧城市应急指挥中心数字化及城市驾驶舱建设方案
目 录 第一章 项目概述 1.1 项目背景 1.2 项目范围 第二章 建设内容 2.1 三维可视化平台 2.1.1 多源数据接入 2.1.2 可视化编排 2.1.3 三维可视化编辑 2.1.4 空间数据可视化 2.1.5 集成框架支持 2.2 可视化场景定制开发 2.2.1 城市驾驶总舱 2.2.2 城市安全分舱 2.…...
![](https://img-blog.csdnimg.cn/img_convert/506773c22b5cecfa33f72f4d4097840e.png)
HSCSEC 2023 个人练习
😋 大家好,我是YAy_17,是一枚爱好网安的小白。本人水平有限,欢迎各位大佬指点,欢迎关注😁,一起学习 💗 ,一起进步 ⭐ 。⭐ 此后如竟没有炬火,我便是唯一的光。…...
![](https://img-blog.csdnimg.cn/ef4c3a858d1d42caaa4248b8d9f4f187.png)
Android 基础知识4-2.7 RelativeLayout(相对布局)
一、RelativeLayout的概述 RelativeLayout(相对布局)是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。在很多时候,线性布局还不能满足我们的需求,比如,我们在一行(列)上显示多个控…...
![](https://img-blog.csdnimg.cn/img_convert/677306a2a454a2f5ced9e63209041857.png)
关于云计算,我们问了ChatGPT 10个问题
ChatGPT懂云计算吗?前些天,我们问了ChatGPT(非Plus收费版)一些问题。1. 什么是云计算?2. 云计算行业的护城河是什么?3. 什么是云原生?4. 微软Azure与亚马逊AWS的主要区别是什么?5. 为…...
![](https://www.ngui.cc/images/no-images.jpg)
Netty学习笔记1
Netty学习笔记(一) 在的互联网环境下,分布式系统大行其道,而分布式系统的根基在于网络编程,而 Netty 恰恰是 Java 领域网络编程的王者。如果要致力于开发高性能的服务器程序、高性能的客户端程序,必须掌握…...
![](https://www.ngui.cc/images/no-images.jpg)
RISK-V品牌的中国化历程(中)
目录 1.技术优势 出道即巅峰 2.生态布道 品牌根植中国 3.应用场景 加速品牌的商业化运作 生态布道 品牌根植中国 2015年成立非盈利组织RISC-V基金会,目前已吸引全球28个国家327家会员,包括英伟达、联发科、苹果、特斯拉、谷歌、高通、IBM、三星、麻省理…...
![](https://img-blog.csdnimg.cn/49520c6d42644988930a2419a8c4664d.png#pic_center)
2023.02.19 学习周报
文章目录摘要文献阅读1.题目2.摘要3.介绍4.本文贡献5.方法5.1 Local Representation Learning5.2 Global Representation Learning5.3 Item Similarity Gating6.实验6.1 数据集6.2 结果7.结论深度学习1.对偶问题1.1 拉格朗日乘数法1.2 强对偶性2.SVM优化3.软间隔3.1 解决问题3.…...
![](https://img-blog.csdnimg.cn/20190602114730587.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzYxMDY5OA==,size_16,color_FFFFFF,t_70)
枚举类的使用方法
一、理解枚举类型 枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看如何写…...
![](https://img-blog.csdnimg.cn/7da65dfd059d4f13b61d0f76a085d078.png)
.NET3.5安装步骤及相关问题。
.NET3.5全称 Microsoft.NETFramework3.5 最新版本-.NET4.8 第一步打开控制面板 windows系统打开控制面板 选择程序 选择.NET3.5安装。 可能会出现问题。 解决方案: 报错代码80240438的常用解决办法: 方法一:检测windows update servic…...
![](https://img-blog.csdnimg.cn/9c23891469734777bb4bd278d097739c.png)
联想M7268激光打印机开机红绿灯双闪报错不打印
故障现象: 一台联想M7268激光打印机开机后电源键、复印键一起双闪,电源键闪红灯、复印键闪绿灯; 检测维修: 根据闪灯故障判断如果无卡纸异常情况下可能是激光器故障,因为以前曾经维修过一台一模一样的机器故障基本相同,先打开机器吧,把硒鼓拿出来先看看有没有卡纸,进纸…...
![](https://www.ngui.cc/images/no-images.jpg)
产品经理知识体系:7.web和app产品需求设计
web和app产品需求设计 思考 笔记 web产品设计 一、交互设计 1.以用户为中心的设计:功能、体验、用户; 将产品功能转化成用户的体验,功能和体验的结合。 2.交互设计模式 交互逻辑 信息结构 信息内容 界面结构 导航设计 二、视觉设计 元素的…...
![](https://www.ngui.cc/images/no-images.jpg)
强化学习概述
一、Modelfree 和 Modelbased Modelfree:不需要理解环境 Modelbased:需要理解环境,并且为环境建立模型 Model-free 中, 机器人只能按部就班, 一步一步等待真实世界的反馈, 再根据反馈采取下一步行动. 而 model-based, 他能通过想象来预判断接…...
![](https://img-blog.csdnimg.cn/0048b8399d4b47478591b768bc265078.png)
NO.1嵌入式入门笔记:常用命令记录
一、前言 Linux文件目录: Linux Shell: 它负责接收用户的输入,根据用户的输入找到其它程序并运行。比如我们输入“ls”并回车时,shell 程序找到“ls”程序并运行,把结果打印出来。Shell有多种实现,我们常用…...
![](https://www.ngui.cc/images/no-images.jpg)
Shell编程
typora-copy-images-to: pictures typora-root-url: pictures 文章目录typora-copy-images-to: pictures typora-root-url: pictures本节课程目标语法和选项语法和选项3. sort工具语法和选项5.tee工具6.diff工具语法和选项7. paste工具8. tr工具语法和选项小试牛刀二、bash的特…...
![](https://img-blog.csdnimg.cn/897a87036a1a4c0b9f6ff502095f7052.png)
网络模型OSI
网络模型OSI定义模型分布数据封装、解封过程数据链路层1.LLC逻辑链路控制子层(Logic Link Control Sub Layer)2.MAC媒介访问控制子层(Medium Acess Control Sub Layer)CSMA/CARST-CST原理OSI定义 OSI:Open Systems Interconnection Reference Model,开放…...
![](https://img-blog.csdnimg.cn/83e4d47ccbd34909b60aba1aa2fa374a.png)
RT-Thread初识学习-01
1. RT-Thread 简介 1.1 RT-Thread 是什么 据不完全统计,世界有成千上万个 RTOS(Real-time operating system,实时操作系统),RT-Thread 就是其中一个优秀的作品。 RT-Thread 内核的第一个版本是熊谱翔先生在 2006 年…...
![](https://img-blog.csdnimg.cn/7b367f235d1d442ba64b73abfb767e18.png#pic_center)
二阶段提交事务的实现和缺点
背景 说起分布式事务,我们最绕不开的一个话题就是该不该使用分布式事务,而要理解为什么做出使用与否的决定,就必须要提到分布式事务中的最经典的实现:两阶段提交事务,本文我们就简答介绍下这个两阶段提交事务以及它的优缺点 技术…...
![](https://upload-images.jianshu.io/upload_images/6302559-1dc2281fd582a2c3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
免费咨询身高发育/google seo
开篇 这篇文章的目的是讲解RM Executor模块当中一些通用的方法,这些方法在各个Executor的父类当中实现的,各个子类Executor模块都会复用,因此抽取出来统一的进行讲解。 个人是认为抽取通用的内容放在一篇文章讲解完后可以针对每类Executor讲解…...
![](/images/no-images.jpg)
c 手机网站开发工具/手机免费建站app
医生和程序员 哪个更好I received an interesting question from a reader recently. He wanted to know how you can tell if you’re making progress as a programmer.我最近收到一个读者的有趣问题。 他想知道如何判断您是否正在以程序员的身份取得进步。 It’s a great q…...
![](/images/no-images.jpg)
如何选择佛山网站建设/淘宝客怎么做推广
1:http://blog.csdn.net/jjwwmlp456/article/details/45198423 2:http://blog.csdn.net/woshisap/article/details/6617118 搜索关键字:DateFormat.format...
![](/images/no-images.jpg)
清溪网站仿做/郑州网站优化排名
C异常处理:logic_error、runtime_error C标准异常类的关系如下:基类是exception,他有4个派生类:bad_alloc,bad_cast,runtime_error,logic_error; runtime_error有3个派生类&#x…...
![](/images/no-images.jpg)
滁州市政府网站集约化建设/专业搜索引擎seo技术公司
http://blog.csdn.net/r91987/article/details/5435328 PPM文件格式分三种: 1. PPM灰度文件 文件头由3行文本组成,可由fgets读出 1)第一行为“P2",表示文件类型 2)第二行为图像的宽度和高度 3&am…...
![](/images/no-images.jpg)
网站开发用什么图片格式最好/域名注册网站有哪些
在在win7下安装了Ubuntu 13.04后,在grub中,win7启动想是最后一个,为了把win7设置为默认启动项,需要更改grub设置。google了半天,发现更改/etc /default/grub是无效的,打开/boot/grub/grub.cfg,里…...