当前位置: 首页 > news >正文

【算法题】2 的 n 次幂的背后

前言: 说实话,真的不爱写算法题相关的文章了,觉得没啥意义,但是对这种比较好玩并且简单,学会了就能很好提高算法效率的文章,还是要写一写,不哭不哭,你不会不是你的错,只是因为你懒,学会了就好了,加油!!

一、2 的 n 次幂的特点

我们先看看 2 的 n 次幂都有什么 ?

n2 的 n 次幂二进制表示
1210
24100
381000
41610000

通过观察,我们可以得出,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。如下表所示:

n2 的 n 次幂 (x)二进制表示(x-1) 的二进制表示x & (x-1)
1210010
241000110
38100001110
41610000011110
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.  把这个负数的绝对值转换为二进制,即求原码 (1012.  把原码取反,即求反码 (111111111111111111111111111110103.  把反码加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));}
}

相关文章:

【算法题】2 的 n 次幂的背后

前言&#xff1a; 说实话&#xff0c;真的不爱写算法题相关的文章了&#xff0c;觉得没啥意义&#xff0c;但是对这种比较好玩并且简单&#xff0c;学会了就能很好提高算法效率的文章&#xff0c;还是要写一写&#xff0c;不哭不哭&#xff0c;你不会不是你的错&#xff0c;只是…...

【人工智能AI】一、NoSQL 企业级基础入门《NoSQL 企业级基础入门与进阶实战》

写一篇介绍什么是NoSQL的技术文章&#xff0c;分5个章节&#xff0c;每个章节细分到3级目录&#xff0c;重点介绍一下优缺点&#xff0c;适用场景&#xff0c;未来发展趋势等。 一、NoSQL简介 1.1 什么是NoSQL NoSQL&#xff08;Not only SQL&#xff09;&#xff0c;意思是“…...

Ubuntu安装opencv库3.4.10,并在cmake工程中引入opencv库

Windows下安装不同&#xff0c;Ubuntu安装OpenCV库时&#xff0c;需要事先安装依赖&#xff0c;而且不同OpenCV库所需的依赖可能会有所不同&#xff0c;下面的依赖亲测 3.4.10 和 4.5.5版本的有效&#xff0c;但是4.6以上版本安装可能会报错。 参考链接&#xff1a;https://bl…...

实现8086虚拟机(四)——mov 和 jmp 指令解码

文章目录mov 指令解码jmp 指令解码这篇文章举例来讲讲 mov 指令和 jmp 指令解码函数的实现&#xff0c;其他的指令解码函数都与这些类似。mov 指令解码 以 mov 指令中的一类&#xff1a;寄存器/内存 到/从 寄存器&#xff0c;来详细说明解码函数的实现。 机器指令格式如下&am…...

数据库技术-函数依赖、键与约束、范式

一、函数依赖 给定一个x&#xff0c;能唯一确定一个Y&#xff0c;就称x确定Y&#xff0c;或者说Y依赖于x&#xff0c;例如YX*X函数。 函数依赖又可扩展以下两种规则: 部分函数依赖:A可确定C&#xff0c;(A,B)也可确定C,(A,B)中的一部分&#xff08;即A&#xff09;可以确定C&a…...

shiro CVE-2020-1957

0x00 前言 在之前只是单纯的复现了漏洞&#xff0c;没有记笔记&#xff0c;所以补充了这篇分析笔记。 影响版本&#xff1a;shiro < 1.5.2 0x01 环境搭建 环境用的是&#xff1a;https://github.com/lenve/javaboy-code-samples/tree/master/shiro/shiro-basic 0x02 漏…...

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…...

部署dapr的辛酸历程

前言dapr大概的了解&#xff0c;个人理解他就是一个分布式服务的管理&#xff0c;把微服务常用的组件(缓存&#xff0c;消息中间件、分布式锁、安全id4等)和监控以及服务注册、发现等等一系列功能以一个很抽象的方式管理起来。可能我们部署微服务用consul、ocelot、polly套件、…...

golang入门笔记——内存管理

文章目录自动内存管理概念自动内存管理-相关概念&#xff1a;追踪垃圾回收&#xff1a;分代GC&#xff08;Generational GC&#xff09;引用计数内存分配Go内存分配-分块Go内存分配——多级缓存Go内存管理优化Balanced GC自动内存管理 概念 1.动态内存 程序在运行时根据需求…...

97. 约数之和

Powered by:NEFU AB-IN Link 文章目录97. 约数之和题意思路代码97. 约数之和 题意 假设现在有两个自然数 A和 B&#xff0c;S是 A^B的所有约数之和。 请你求出 S mod 9901的值是多少。 思路 ABA^BAB的约数之和为&#xff1a;sumAB(1p1p12...p1Ba1)(1p2p22...p2Ba2)...sum_{A^B…...

想和20岁的自己说

男生床头千万不要放卫生纸不要叫自己的女朋友早睡&#xff0c;更不能叫她早起&#xff0c;否则有你好受的。成年人的默契&#xff1a;和异性单独出去旅游&#xff0c;如果没有明确拒绝开一间房&#xff0c;那基本上默认后面会发生的事情不要去考验人性&#xff0c;世上99%的人经…...

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 …...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题(3)

目录 模块A 基础设施设置与安全加固 &#xff08;本模块20分&#xff09; 一、项目和任务描述&#xff1a; 假定你是某企业的网络安全工程师&#xff0c;对于企业的服务器系统&#xff0c;根据任务要求确保各服务正常运行&#xff0c;并通过综合运用用户安全管理与密码策略、…...

智慧城市应急指挥中心数字化及城市驾驶舱建设方案

目 录 第一章 项目概述 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.…...

HSCSEC 2023 个人练习

&#x1f60b; 大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白。本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;欢迎关注&#x1f601;&#xff0c;一起学习 &#x1f497; &#xff0c;一起进步 ⭐ 。⭐ 此后如竟没有炬火&#xff0c;我便是唯一的光。…...

Android 基础知识4-2.7 RelativeLayout(相对布局)

一、RelativeLayout的概述 RelativeLayout&#xff08;相对布局&#xff09;是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。在很多时候&#xff0c;线性布局还不能满足我们的需求&#xff0c;比如&#xff0c;我们在一行&#xff08;列&#xff09;上显示多个控…...

关于云计算,我们问了ChatGPT 10个问题

ChatGPT懂云计算吗&#xff1f;前些天&#xff0c;我们问了ChatGPT&#xff08;非Plus收费版&#xff09;一些问题。1. 什么是云计算&#xff1f;2. 云计算行业的护城河是什么&#xff1f;3. 什么是云原生&#xff1f;4. 微软Azure与亚马逊AWS的主要区别是什么&#xff1f;5. 为…...

Netty学习笔记1

Netty学习笔记&#xff08;一&#xff09; 在的互联网环境下&#xff0c;分布式系统大行其道&#xff0c;而分布式系统的根基在于网络编程&#xff0c;而 Netty 恰恰是 Java 领域网络编程的王者。如果要致力于开发高性能的服务器程序、高性能的客户端程序&#xff0c;必须掌握…...

RISK-V品牌的中国化历程(中)

目录 1.技术优势 出道即巅峰 2.生态布道 品牌根植中国 3.应用场景 加速品牌的商业化运作 生态布道 品牌根植中国 2015年成立非盈利组织RISC-V基金会&#xff0c;目前已吸引全球28个国家327家会员&#xff0c;包括英伟达、联发科、苹果、特斯拉、谷歌、高通、IBM、三星、麻省理…...

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.…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...