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

LeetCode 面试题 05.04. 下一个数

文章目录

  • 一、题目
  • 二、Java 题解
    • 2.1 求大数:
    • 2.2 求小数:

一、题目

  下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。

示例1:

输入: num = 2(或者0b10)
输出: [4, 1] 或者([0b100, 0b1])

示例2:

输入: num = 1
输出: [2, -1]

提示:

  • num 的范围在 [1, 2147483647] 之间;
  • 如果找不到前一个或者后一个满足条件的正数,那么输出 -1。

  点击此处跳转题目。

二、Java 题解

  看了一些题解后,分享一下我个人认为自己的较为简单易懂的代码。

  求大数和小数可以看做是进/退位运算,因此从右向左对二进制进行遍历,使用 ones 记录出现过 1 的次数。

2.1 求大数:

  求大数即进位,从左向右用指针 i(从 0 开始计数)对 num 进行判断,遇到 1 后第一次遇到 0 即停止。此时 i 指向 0,右方是连续的 1 串。将右方的连续 1 串进位(即 i 指向的 0 变为 1),之后重组剩余的 ones - 1 个 1(向右靠拢),得到最小的大数:

⟵ i 0 1 0 ⏞ i = 5 1 1 1 ⏞ o n e s = 3 0 0 ⇓ + 1 0 0 ⏞ i − o n e s 个 0 1 1 ‾ 0 0 0 0 0 ⇓ + 1 1 ⏞ o n e s − 1 个 0 1 1 0 0 0 1 ‾ 1 ‾ \begin{array}{l} \hspace{10em} \longleftarrow^{\normalsize{i}}\\ 0 \hspace{1em} 1 \hspace{0.5em} \overbrace{0}^{i=5} \hspace{0.5em} \overbrace{1 \hspace{1em} 1 \hspace{1em} 1 }^{ones=3} \hspace{1em} 0 \hspace{1em} 0 \\\\ \hspace{1em}\hspace{1em}\hspace{1em}\hspace{1em}\hspace{1em}\Downarrow \scriptsize {\hspace{1em}+\hspace{1em}1\overbrace{0\hspace{1em}0}^{i-ones个}} \\\\ 0 \hspace{1em} 1 \hspace{1em} \underline{\bold{1}} \hspace{0.9em} 0 \hspace{1em} 0 \hspace{1em} 0 \hspace{1em} 0 \hspace{1em} 0 \\\\ \hspace{1em}\hspace{1em}\hspace{1em}\hspace{1em}\hspace{1em}\Downarrow \scriptsize {\hspace{1em}+\overbrace{1\hspace{1em}1}^{ones-1个}}\\\\ 0 \hspace{1em} 1 \hspace{1em} 1 \hspace{1em} 0 \hspace{1em} 0 \hspace{1em} 0 \hspace{1em} \underline{\bold{1}} \hspace{0.9em} \underline{\bold{1}} \end{array} i010 i=5111 ones=300+100 iones01100000+11 ones101100011

2.2 求小数:

  求小数即退位,从左向右用指针 i 对 num 进行判断,遇到 0 后第一次遇到 1 即停止。此时 i 指向 1,右方是连续的 0 串。i 位退位(即 i 指向的 1 变为 0),之后重组剩余的 ones - 1 个 1(向左靠拢),得到最大的小数:

⟵ i 1 1 ⏞ i = 6 0 0 1 1 1 1 ⏞ o n e s = 4 ⇓ + 1 1 1 0 1 ‾ 0 0 0 0 ⇓ − 1 0 0 0 0 ⏞ o n e s 个 1 1 0 0 ‾ 0 0 0 0 ⇓ − 1 0 ⏞ i − o n e s − 1 个 1 0 ‾ 1 ‾ 1 ‾ 1 ‾ 1 ‾ 1 ‾ ⏞ o n e s + 1 个 0 ⏟ i 个 \begin{array}{l} \hspace{10em} \longleftarrow^{\normalsize{i}}\\ 1 \hspace{0.5em} \overbrace{1}^{i=6} \hspace{0.5em} 0 \hspace{1em} 0 \hspace{1em} \overbrace{1 \hspace{1em} 1 \hspace{1em} 1 \hspace{1em} 1}^{ones=4} \\\\ \hspace{1em}\hspace{1em}\hspace{1em}\hspace{1em}\hspace{1em}\Downarrow \scriptsize {\hspace{1em}+\hspace{1em}1} \\\\ 1 \hspace{1em} 1 \hspace{1em} 0 \hspace{1em} \underline{\bold{1}} \hspace{0.9em} 0 \hspace{1em} 0 \hspace{1em} 0 \hspace{1em} 0 \\\\ \hspace{1em}\hspace{1em}\hspace{1em}\hspace{1em}\hspace{1em}\Downarrow \scriptsize {\hspace{1em}-1\hspace{1em}\overbrace{0\hspace{1em}0\hspace{1em}0\hspace{1em}0}^{ones个}}\\\\ 1 \hspace{1em} 1 \hspace{1em} 0 \hspace{1em} \underline{\bold{0}} \hspace{0.9em} 0 \hspace{1em} 0 \hspace{1em} 0 \hspace{1em} 0 \\\\ \hspace{1em}\hspace{1em}\hspace{1em}\hspace{1em}\hspace{1em}\Downarrow \scriptsize {\hspace{1em}-1\hspace{0.4em}\overbrace{0}^{i-ones-1个}}\\\\ 1 \hspace{1em} \underline{\bold{0}} \hspace{0.8em} \underbrace{\overbrace{\underline{\bold{1}} \hspace{0.8em} \underline{\bold{1}} \hspace{0.85em} \underline{\bold{1}} \hspace{0.8em} \underline{\bold{1}} \hspace{0.85em} \underline{\bold{1}}}^{ones+1个} \hspace{0.85em} 0}_{i个} \\\\ \end{array} i11 i=6001111 ones=4+11101000010000 ones1100000010 iones110i 11111 ones+10

class Solution {public int[] findClosedNumbers(int num) {int[] ans = new int[] { -1, -1 };// 求大数int ones = 0;for (int i = 0; i < 31; i++) {               // i < 31 表示不考虑符号位if ((num & (1 << i)) != 0) ones++;       // 遇到 1 更新 onesif ((num & (1 << i)) == 0 && ones > 0) { // 遇到 1 后的第一个 0ans[0] = num + (1 << (i - ones)) + (1 << (ones - 1)) - 1;break;}}// 求小数ones = 0;for (int i = 0; i < 31; i++) {if ((num & (1 << i)) == 0) continue; // 忽略 0// 以下为遇到 1 的情况if (i > ones) {                      // i 比 ones 大,表示前面遇到了 0ans[1] = num - (1 << ones) - (1 << (i - ones - 1)) + 1;break;}ones++;                              // 更新 ones}return ans;}
}
  • 时间:0 ms,击败 100.00% 使用 Java 的用户
  • 内存:37.83 MB,击败 91.57% 使用 Java 的用户

相关文章:

LeetCode 面试题 05.04. 下一个数

文章目录 一、题目二、Java 题解2.1 求大数&#xff1a;2.2 求小数&#xff1a; 一、题目 下一个数。给定一个正整数&#xff0c;找出与其二进制表达式中1的个数相同且大小最接近的那两个数&#xff08;一个略大&#xff0c;一个略小&#xff09;。 示例1: 输入&#xff1a; n…...

SDXL prompt 笔记

模型 模型有两个&#xff0c;分别是 stable-diffusion-xl-base-1.0、stable-diffusion-xl-refiner-1.0。 base 模型是用来做文生图&#xff0c;refiner 模型是用来做图生图的。 SDXL 模型之 base、refiner 和 VAE_云水木石的博客-CSDN博客 分辨率 默认是1024*1024&#xf…...

使用Redis管道进行查询接口性能优化

一、引入 在我们的正常项目开发过程中&#xff0c;我们会通过Redis缓存数据&#xff0c;来帮我们进行异步任务&#xff0c;分担外部的请求压力 但是Redis缓存也有一定的限制&#xff0c;因为我们在向请求过来时&#xff0c;Redis客户端都要向服务端发送一次请求&#xff0c;相应…...

初学vue.js

准备Vue.js环境 ① 下载环境&#xff1a; javaScript语言的程序包&#xff1a;外部js文件 对于Vue来说&#xff0c;导入Vue的外部js文件就能够使用Vue框架了。 Vue框架的js文件获取: 官网提供的下载地址&#xff1a;https://cdn.jsdelivr.net/npm/vue/dist/vue.js ②导入环境…...

React的thunk中间件

Thunk 是一种中间件&#xff0c;它可以在 Redux 中处理异步操作。Thunk 中间件允许你在 action 中返回一个函数&#xff0c;而不仅仅是一个普通的 action 对象。这个返回的函数可以接收 dispatch 和 getState 作为参数&#xff0c;并且可以在函数内部进行异步操作。当使用 Thun…...

数组初学者向导:使用Python从零开始制作经典战舰游戏

引言 战舰游戏&#xff0c;一个广受欢迎的经典游戏&#xff0c;为玩家提供了策略与猜测的完美结合。这个游戏的核心思想是通过猜测敌方船只的位置并尝试击沉它们来赢得比赛。在这篇文章中&#xff0c;我们将使用Python语言和数组来构建这款游戏&#xff0c;让你更加了解数组的…...

【STM32】IAP升级 预备知识

IAP&#xff08;In Application Programming&#xff09;简介 Flash够大的情况下&#xff0c;上电后的程序通过修改 MSP 的方式&#xff0c;可以在一块Flash上存在多个功能差异的程序。 IAP是为了在执行正常功能前&#xff0c;为了升级功能&#xff0c;提前运行的一段程序。这…...

asp.net网站的建立及运行

点击创建新项目 在输入框中输入asp.net&#xff0c;并选择图中的 点击下一步 点击创建 然后&#xff0c;右键&#xff0c;添加&#xff0c;新建项 选择web窗体 点击添加 点击视图&#xff0c;工具箱 选择一个label&#xff0c;记住这个id 空白处右键&#xff0c;查看代码 添…...

怎么把webm转换成mp4?

怎么把webm转换成mp4&#xff1f;与MP4这位视频格式大哥相比&#xff0c;Webm这种视频格式还有很多小伙伴对它不太熟悉&#xff0c;因为大家平时也是偶尔才能接触到&#xff0c;属于不常用的视频格式。Webm是一种开放、免费的媒体文件格式&#xff0c;尽管如今它的应用范围比以…...

RabbitMQ 消息应答

每日一句 物是人非事事休,欲语泪先流。 概述 为了保证消息在发送过程中不丢失,RabbitMQ引入了消息应答机制, 消费者在接收到消息并且处理该消息后,告诉RabbitMQ它已经处理了,RabbitMQ可以把消息删除了。 自动应答 消息发送后立即被认为已经传送成功,这种模式需要在…...

【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

文章目录 一、全局函数 与 成员函数 相互转化1、成员函数转为全局函数 - 多了一个参数2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 二、有参构造函数设置默认参数值三、返回匿名对象与返回引用四、完整代码示例 一、全局函数 与 成员函数 相互转化 1、成员函数转为全局…...

游戏遇到的问题

天涯明月刀 就是天刀的假全屏&#xff0c;很多天刀玩家可能玩其他游戏比较少或者对电脑了解不多&#xff0c;不在意帧数&#xff0c;但是肯定还是有一部分玩家发现了这个问题&#xff0c;就是“我使命召唤12都能跑到60帧的机器跑个破天刀40帧甚至30帧?”问题何在呢&#xff1…...

高性能系统的性能优化技巧:从专家的经验中学习 | 开源日报 No.40

binhnguyennus/awesome-scalability Stars: 48.3k License: MIT 这个项目是一个阅读列表&#xff0c;用于说明可扩展、可靠和高性能大规模系统的模式。该项目通过知名工程师的文章和可信参考资料来解释概念&#xff0c;并从为数以百万计甚至十亿用户提供服务的经过实战验证的系…...

Linux系统编程——进程间通信的学习

学习参考博文&#xff1a; 进程间的五种通信方式介绍Linux 信号介绍 Linux系统编程学习相关博文 Linux系统编程——文件编程的学习Linux系统编程——进程的学习Linux系统编程——线程的学习Linux系统编程——网络编程的学习 Linux系统编程——进程间通信的学习 一、概述1. 无…...

人工智能AI 全栈体系(六)

第一章 神经网络是如何实现的 这些年神经网络的发展越来越复杂&#xff0c;应用领域越来越广&#xff0c;性能也越来越好&#xff0c;但是训练方法还是依靠 BP 算法。也有一些对 BP 算法的改进算法&#xff0c;但是大体思路基本是一样的&#xff0c;只是对 BP 算法个别地方的一…...

NPDP是什么?考了有用吗?

1&#xff09;NPDP是什么&#xff1f; NPDP&#xff0c;全称为New Product Development Professional&#xff0c;即新产品开发专业人员。NPDP认证是由世界产品开发协会&#xff08;PDMA&#xff09;推出的一项专业认证。它旨在评估和认可个人在新产品开发领域的专业知识和技能…...

关于安卓SVGA浅尝(二)加载数据

关于安卓SVGA浅尝&#xff08;二&#xff09;加载数据 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发&#xff0c;都会和动画打交道&#xff0c;动画的方案选取&#xff0c;就有很多选择。如Json动画&#xff0c;svga动画&#xff0c;gif等等。各有各的优势。目前项…...

使用matlab产生二维动态曲线视频文件具体举例

使用matlab产生二维动态曲线视频文件举例 在进行有些函数变化过程时候&#xff0c;需要用到直观的动态显示&#xff0c;本博文将举例说明利用Matlab编程进行二维动态曲线的生成视频文件。 一、问题描述 利用matlab编程实现 y 1 s i n ( t ) , y 2 c o s ( t ) , y 3 s i …...

Selenium自动化测试框架常见异常分析及解决方法

01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium, 解决方法: 在pycharm中通过设置或terminal面板重新安装selenium 原因2: 当前项目下有selenium.py,和系统包名冲突导致, …...

[TI] [Textual Inversion] An image is worth an word

自己的理解&#xff1a; 根据几个图像&#xff0c;找出来一个关键字可以代表它们&#xff0c;然后我们可以再用这个关键字去生成新的东西。 提出关键字 1 Introduction word->token->embedding Textual Inversion过程 需要&#xff1a; ① a fixed, pre-trained text…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...