首页 > 编程语言 >#yyds干货盘点# LeetCode程序员面试金典:下一个数

#yyds干货盘点# LeetCode程序员面试金典:下一个数

时间:2022-12-29 18:31:38浏览次数:38  
标签:yyds return int res num 金典 c1 c0 LeetCode

题目:

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

示例1:

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

示例2:

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

代码实现:

class Solution {
public int[] findClosedNumbers(int num) {
int[] res = new int[2];
if (num <=0 || num>=Integer.MAX_VALUE) {
res[0] = -1;
res[1] = -1;
} else {
res[0] = getNext(num);
res[1] = getPrev(num);
}
return res;
}

// 取得后一个较大的数
private int getNext(int n) {
// 计算c0和c1,用于找到最右边非拖尾0的下标p
int c = n;
int c0 = 0;
int c1 = 0;
while (((c&1)==0)&&(c!=0)) {
c0++;
c >>= 1;
}
while ((c&1)==1) {
c1++;
c >>= 1;
}

// 错误:若n=111111...000, 那么就没有更大的数字
// 如果是n的二进制不存在可翻转的0,或者n就是0
if (c0 + c1 == 31 || c0 +c1 ==0) {
return -1;
}

int p = c0+c1; // 前提:最右边,非拖尾0的位置
n |= (1<<p); // 步骤1:翻转最右边,非拖尾0
n &= ~((1<<p)-1); // 步骤2:将p右方的所有位清零
n |= (1<<(c1-1))-1; // 步骤3:在右方插入(c1-1)个1

return n;
}
}

标签:yyds,return,int,res,num,金典,c1,c0,LeetCode
From: https://blog.51cto.com/u_13321676/5978712

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:整数转换
    题目:整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。示例1:输入:A=29(或者0b11101),B=15(或者0b01111)输出:2示例2:输入:A=1,B=2输出:2代码实现:classS......
  • LeetCode 删除排序数组中的重复项
    题目给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。由于在某些语言中不能......
  • leetcode-28找出字符串中第一个匹配项的下标(kmp)
    28.找出字符串中第一个匹配项的下标给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不......
  • #yyds干货盘点# react笔记之学习之空列表提示
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......
  • Leetcode203
    题意:去掉给定头ListNode*head的单链表内val等于一个给定val的节点并返回头思路:此题删除链表中元素是很简单的,只需要让待删节点之前一个节点指向待删节点之后一个节......
  • LeetCode 寻找数组的中心下标算法题解 All In One
    LeetCode寻找数组的中心下标算法题解AllInOne724.FindPivotIndex寻找数组的中心下标"usestrict";/****@authorxgqfrms*@licenseMIT*@copyr......
  • LeetCode-224. 基本计算器
    题目来源224.基本计算器题目详情给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如......
  • 代码随想录算法训练营第一天LeetCode704,35,34,27
    代码随想录算法训练营第一天|LeetCode704,35,34,27LeetCode704二分查找题目链接:https://leetcode.cn/problems/binary-search///第一次做还不知道二分中的左闭右开和左闭......
  • #yyds干货盘点# LeetCode程序员面试金典:二进制数转字符串
    题目:二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。示例1:输入:0.......
  • #yyds干货盘点# LeetCode程序员面试金典:翻转数位
    题目:给定一个32位整数num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。示例1:输入:num=1775(110111011112)输出:8示例2:输入:num=......