当前位置: 首页 > 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…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

英国云服务器上安装宝塔面板(BT Panel)

在英国云服务器上安装宝塔面板&#xff08;BT Panel&#xff09; 是完全可行的&#xff0c;尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎&#xff0c;虽然官方主要面向中国大陆…...