题目要求通过最少的操作次数将数字 x 变为 y。计算器有两种操作:乘以2和减去1。直接从 x 到 y 进行操作可能会比较复杂,但我们可以逆向思考,从 y 到 x 进行操作。逆向操作有两种:除以2(当 y 是偶数时)和加1(当 y 是奇数时)。通过逆向操作,我们可以更高效地找到最少的操作次数。
逆向操作:我们从 y 开始,逐步向 x 逼近。每次操作时,如果 y 是偶数,我们将其除以2;如果 y 是奇数,我们将其加1。
计数操作次数:每次进行逆向操作时,操作次数 ans 加1。
最终调整:当 y 小于或等于 x 时,我们只需要将 y 加到 x 即可,这部分的操作次数为 x - y。
返回结果:最终的操作次数为 ans + x - y。
public static int solution(int x, int y) {
int cnt = 0;
while (y > x) {
if (y % 2 == 0) y /= 2;
else y ++;
cnt++;
}
return cnt + x - y;
}