如题
一眼看上去,两种思路,一种按题意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,难搞一些效果反而查了