LeetCode(991 坏了的计算器)

如题在这里插入图片描述
一眼看上去,两种思路,一种按题意X最快增长,一种是Y最快下降。第二种更好实现,

public static int brokenCalc(int X, int Y) {
		int count=0;		
		while(X<Y) {  //想要Y最速下降,必然是优先除2
			if(Y%2==0) {  //对应X的*2操作
				Y=Y>>1;
			}else {		//对应X的-1操作
				Y=Y+1;
			}
			count++;
		}
		return X==Y?count:count+X-Y;   //相等直接返回否则加上对应差值的+1操作
	}

结果还可以。在这里插入图片描述
如果使用第一种思路,难度更高。因为最速递增的话的确是同样是优先*2,但是取得X>Y后需要判断-1操作的具体步数,此时就需要判断最优的-1步骤发生在哪步了。

public static int brokenCalc1(int X, int Y) {
		int count=0;
		while(X<Y) {  //优先判断*2次数
			count++;
			X=X<<1;
		} 
		int m =X-Y;
		int n=count<<1;  //差值除2的次数应当不大于前面*2的次数
		int flag=count;   //限制后面除2次数
		while(m!=0) {
			if(m%2==0&&flag<n) {  //可整除2且整除2次数小于可用次数,则除2,*2时已经计入操作数,无需修改
				m=m>>1;
			    flag++;
			}else {   //否则减1操作,此时需要计入操作数
				m--;
				count++;
			}
		}
		return count;
	}

emmm,难搞一些效果反而查了在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值