前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。
小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。
输入
一个整数n,表示小明最初抓取的糖果数(n小于某个上限,如1000000或10000000000)。
输出
输出小明最少需要多少次操作能将手中糖果分至只剩一颗。
示例
输入:
15
输出:5
解题思路
关键条件:
每取或放记录一次
每分一次记录一次
思路
手里的糖果数满足2的N次方条件是分糖最快的, 因此每次取或放都要尽量让手里的糖满足2的N次方条件
题解
Java实现
package huawei.e100;
import java.util.Scanner;
/**
* @author arnold
* @date 2024年12月9日
*
*/
public class T08 {
private static int run(int num){
int count = 0;
while( num != 1) {
if(num%2 == 0) {
num = num/2;
} else {
//取出、放回 记一次
count +=1;
// 当为2的N次方时操作次数最少
if (((num -1) & (num-2)) == 0) { // 减一为2的N次方
num = (num-1)/2;
} else {
num = (num+1)/2; // 加一为2的N次方 或其他
}
}
// 分配记一次
count +=1;
}
return count;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
int res = run(n);
System.out.println(res);
}
}
}
854

被折叠的 条评论
为什么被折叠?



