这个也是easy,要不就简单除2加上简单减一,然后交了,肯定错了,错在65535上,(这样做是不对的,应该自己多想几组测试用例,充分考虑各种情况后再提交),然后想想,除2是必须做的,然后什么时候加一,什么时候减一,我猜,仅仅是猜测,应该是哪种操作使得变化后的数二进制表示中1的数目最少即可,这样以后只用除2就可以了,然后使用__builtin_popcount函数,然后判断是加一还是减一,然后就过了。
我还以为没事了,正准备去吃饭了,突然看到update,看到输入3,应该输出2,运行我的程序,居然出错了,然后开始修bug,真是惊心动魄,这次不知道怎么rank,哎!
int integerReplacement(int a) {
if(a == 1) return 0;
if(a == 3) return 2;
int res = 0;
long long n = a;
while(n != 1) {
if(n == 3) {
n = 1;
res += 2;
continue;
}
if(n & 1) {
long long a = n + 1, b = n - 1;
if(__builtin_popcount(a) > __builtin_popcount(b)) {
n = b;
} else {
n = a;
}
} else n >>= 1;
res++;
}
return res;
}