「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」
前言
每日一题,轻松解题
每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。
正文
:坏了的计算器
难度:中等
题目要求:
在显示着数字的坏计算器上,我们可以执行以下两种操作:
双倍(Double):将显示屏上的数字乘 2;
递减(Decrement):将显示屏上的数字减 1 。
最初,计算器显示数字 X。
返回显示数字 Y 所需的最小操作数。
分析题目:
只能使用 ×2 或者 -1 的方式,将X的值变成Y
举个例子
输入: X = 2, Y = 3
输出: 2
解释: 先进行双倍运算,然后再进行递减运算 {2 -> 4 -> 3}.
:解题
理清思路:
题目要求数字只能双倍或者减一,假设现在有两个数,X=5,Y=13,这时候其实是很难判断要先双倍,还是减一,甚至没有办法一下子就想出操作最少的步骤,这个时候该怎么办呢?很多时候在这种限制很多,并且很难判断的时候,我们可以用数学中的逆向思维,既然X变成Y不好判断,那我们就把Y变成X,当然条件也要相反才行,那就是Y => X 只能除以2和加一的操作,
分析:
当 Y 是偶数,如果先执行 2 次加法操作,再执行 1 次除法操作,我们可以通过先执行 1 次除法操作,再执行 1 次加法操作以使用更少的操作次数得到相同的结果 [(Y+2) / 2 vs Y/2 + 1]。
当 Y 是奇数,如果先执行 3 次加法操作,再执行 1 次除法操作,我们可以将其替代为顺次执行加法、除法、加法操作以使用更少的操作次数得到相同的结果 [(Y+3) / 2 vs (Y+1) / 2 + 1]。
结果:
当 Y 大于 X 时,如果它是奇数,我们执行加法操作,否则执行除法操作。之后,我们需要执行 X - Y 次加法操作以得到 X。
编辑代码:
1.首先定义一个函数,设置一个变量
function getMinOperationCount (X, Y) {
let ans = 0;
};
2.判断Y与X的大小,当X大于Y时,只能执行减法直接返回,否则进行操作
while (Y > X) {
ans++;
if (Y % 2 == 1) {
Y++;
console.log(Y);
} else {
Y /= 2;
console.log(Y);
}
}
- 判断y是奇数或是偶数,奇数加一,偶数除二,直到 Y = X 或 Y < X
3.函数返回最终结果
function getMinOperationCount (X, Y) {
let ans = 0;
while (Y > X) {
ans++;
if (Y % 2 == 1) {
Y++;
console.log(Y);
} else {
Y /= 2;
console.log(Y);
}
}
return ans + X - Y;
};
总结
无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。