362.坏计算机的最小操作问题<字节青训营-中等题>

1.题目

问题描述

小M有一个坏掉的计算器,它有两种功能可以操作屏幕上显示的数字:

  1. 将显示的数字乘以2;
  2. 将显示的数字减去1。

现在,计算器上显示的数字是 x,小M希望通过最少的操作次数,将数字变为 y

请你帮忙计算一下,最少需要多少次操作才能将数字从 x 变为 y


测试样例

样例1:

输入:x = 2,y = 3

输出:2

样例2:

输入:x = 4,y = 7

输出:2

样例3:

输入:x = 3,y = 66

输出:9

2.思路

  1. 逆向操作:我们从 y 开始,逐步向 x 逼近。每次操作时,如果 y 是偶数,我们将其除以2;如果 y 是奇数,我们将其加1。
  2. 计数操作次数:每次进行逆向操作时,操作次数 ans 加1。
  3. 最终调整:当 y 小于或等于 x 时,我们只需要将 y 加到 x 即可,这部分的操作次数为 x - y
  4. 返回结果:最终的操作次数为 ans + x - y

3.代码

def solution(x: int, y: int) -> int:
    # PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
    # write code here
    cnt = 0
    ans = 0
    while y > x:
        if y % 2 == 0:
            y //= 2
        else:
            y += 1
        cnt += 1
    ans = cnt
    if y < x:
        ans = cnt + x - y
    return ans  # Placeholder return

if __name__ == '__main__':
    print(solution(x=2, y=3) == 2)
    print(solution(x=4, y=7) == 2)
    print(solution(x=3, y=66) == 9)

改进:

def solution(x: int, y: int) -> int:
    ans = 0
    while y > x:
        ans += 1
        y = y + 1 if y % 2 else y // 2
    return ans + x - y

if __name__ == '__main__':
    print(solution(x = 2,y = 3) == 2)
    print(solution(x = 4,y = 7) == 2)
    print(solution(x = 3,y = 66) == 9)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值