[leetcode] 397. Integer Replacement

我是链接

这个也是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;
    }
原文地址:https://www.cnblogs.com/y119777/p/5861360.html