[leetcode]397. Integer Replacement

public int integerReplacement(int n) {
        /*
        可以将问题想做是一串二进制,怎么把二进制最快的处理到只剩下一位1
        问题的关键是奇数的情况有两种,不确定用哪一种,如果两种都尝试会TLE
        +1或者-1,更快的是能尽快消除一位或者几位
        看了答案,方法是尽快能让后两位都变成0,也就是可以连续除以2:
        奇数的最后一位肯定是1,如果倒数第二位是1,那么+1比较好
        如果倒数第二位是0,那么-1比较好
         */
        int res = 0;
        long num = n;
        while (num!=1)
        {
            if (num%2==0)
                num/=2;
            else
            {
                //3是一种特殊情况,它需要-1
                if (num==3)
                {
                    res+=2;
                    break;
                }
                //判断倒数第二位进行处理
                num = (num&2)==2?num+1:num-1;

            }
            res++;
        }
        return res;
    }

 

posted @ 2018-03-01 13:41  stAr_1  阅读(175)  评论(0编辑  收藏  举报