Leetcode 面试题 05.04. 下一个数

2025/04/12

面试题 05.04. 下一个数

面试题 05.04. 下一个数

提示

中等

62

相关企业

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

示例1:

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

示例2:

 输入:num = 1
输出:[2, -1]
class Solution:
   
    def findClosedNumbers(self, num: int) -> List[int]:
        # 1特判
        if num == 1:
            return [2, -1]
        '''
        如何找一个大数?
        思路:
        将num二进制最低位的1进一位得到a,之后将num中发生进位的1挪到最后,
        再将先进位的最后一位1向后移动一位,将a和b的结果使用或运算合并

        例如 0001 0110
        1.通过t=num & -num 找到最低位1所在的位 0000 0010
        y=num+t让最后一位发生进位 0001 1000
        2.将进位的1挪到最后,再将先进位的1向右挪一位,去掉
        0000 0001
        larger = (num & ~y) // t >> 1
        3.将y和larger组合
        0001 1001
        '''
        # 例如0001 0111 -> 0001 1011
        def next_combo(num):
            # 获取最低位1的位权 0000 0001
            t = num & -num
            # 将最低位的1进一位 0001 1000
            y = num + t
            # num & ~y 获取发生进位的1的序列 0000 0111
            # (num & ~y)//t 将发生进位的最低位1挪到最右边,再向右移动一位,保证1的数目不变 0000 0011
            larger = (num & ~y)//t >> 1
            # 两个结果取或 0001 1011
            return larger|y
        mx=next_combo(num)
        mn=~next_combo(~num)
        if mx>2147483647: mx=-1
        if mn==0: mn=-1
        return [mx,mn]

Post Directory