1.题目
问题描述
小M有一个坏掉的计算器,它有两种功能可以操作屏幕上显示的数字:
- 将显示的数字乘以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.思路
- 逆向操作:我们从
y
开始,逐步向x
逼近。每次操作时,如果y
是偶数,我们将其除以2;如果y
是奇数,我们将其加1。 - 计数操作次数:每次进行逆向操作时,操作次数
ans
加1。 - 最终调整:当
y
小于或等于x
时,我们只需要将y
加到x
即可,这部分的操作次数为x - y
。 - 返回结果:最终的操作次数为
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)