给两个int数X和Y,问X最少要通过多少次减1或乘以2的操作得到Y。

思路:倒过来求,从Y到X。因为从X到Y太多的不确定,但Y到X容易。
(1) 如果Y小于X,只能自减;
(2) 如果Y大于X,且为偶数,则除以2,如果除完小于X,执行上一步。
(3) 如果Y是奇数,则肯定不能除以2,否则会出现小数了,所以Y加1(X到Y是减1,Y到X是加1),下一轮循环。
时间复杂度:O(logY),空间复杂度:O(1)。
1/**
2 * @author lxn
3 * @description 991. Broken Calculator
4 * @create 2020-03-19 21:49
5 */
6public class Algorithm991 {
7 public static void main(String[] args) {
8 int X = 5;
9 int Y = 8;
10 int res = new Solution991().brokenCalc(X, Y);
11 }
12}
13
14class Solution991 {
15 public int brokenCalc(int X, int Y) {
16 int step = 0;
17 while (X != Y) {
18 if (Y < X) { // Y小于X,只能减1
19 step += X - Y; // 差多少就减多少次1
20 break;
21 }
22 // Y是奇数: 加1; Y是偶数: 除以2
23 Y = Y % 2 == 1 ? Y + 1 : Y / 2;
24 step++; // 每操作一次步数加1
25 }
26
27 return step;
28 }
29}
文章转载自程序媛的梦想,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




