面试题 05.04. 下一个数

该问题涉及计算机科学中的二进制表示。给定一个正整数,目标是找到两个整数,它们的二进制表示中1的个数与输入数字相同,一个比输入数略大,另一个略小。提供的代码实现通过遍历二进制字符串来寻找这两个数。

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

示例1:

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/closed-number-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码

不能超过31位

class Solution:
    def findClosedNumbers(self, num: int) -> List[int]:
        num_2 = bin(num)[2:]
        # 初始化加0
        if len(num_2) < 31:
            num_2 = "0" + num_2
        ans = [None, None]
        for i in range(len(num_2), -1, -1):
            if ans[0] is None and num_2[i - 1:i + 1] == "01":
                ans[0] = num_2[:i - 1] + "10" + "0" * num_2[i + 1:].count("0") + "1" * num_2[i + 1:].count("1")
            if ans[1] is None and num_2[i - 1:i + 1] == "10":
                # 先补充1 后补0 因为变小了 后面尽量大
                ans[1] = num_2[:i - 1] + "01" + "1" * num_2[i + 1:].count("1") + "0" * num_2[i + 1:].count("0")
        ans[0] = -1 if ans[0] is None else int(ans[0], 2)
        ans[1] = -1 if ans[1] is None else int(ans[1], 2)
        return ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值