397. Integer Replacement

October 22, 2016

397. Integer Replacement

描述:

Given a positive integer n and you can do operations as follow:

1.If n is even, replace n with n/2.

2.If n is odd, you can replace n with either n + 1 or n - 1.

What is the minimum number of replacements needed for n to become 1?

Example 1:

Input:
8

Output:
3

Explanation:
8 -> 4 -> 2 -> 1

Example 2:

Input:
7

Output:
4

Explanation:
7 -> 8 -> 4 -> 2 -> 1
or
7 -> 6 -> 3 -> 2 -> 1

这道题要求我们寻找一种最快的将给定数字变成1的路径,转换规则题中已经给出,感觉就是在观察中得出一条规律,即:

1.如果某个数的末尾是01,则-1会比较快

2.如果某个数末尾是11,则+1会比较快,但这里有一个特例,即3,3虽然以11结尾,但是却发现它如果+1反而会比较慢,所以我们将其作为特例考虑。

3.其余情况全部直接右移一位

为什么会得出这样的规律呢?因为要想最快的将一个数通过除以2的方式变成1,就要让其含有尽可能多的0,所以以01结尾的应该-1,以11结尾的应该+1(造成连续进位)。

还有一个边界条件,当给出的数为INT_MAX时,也就是二进制表示为32个1的那个数,此时如果判断其以11结尾之后,必然会+1,那么就会造成溢出,所以我们在最开始添加一个if判断进行过滤。 (个人感觉这是这道题唯一考察思维严密性的地方)

我主观上认为这道题没什么意思,或许是数学水平还不够吧,代码如下:

class Solution {
public:
    int integerReplacement(int n) {
        int count=0;
        if(n==INT_MAX)
            return 32;
        while(n!=1){
            if((n&1)==0)
                n=n>>1;
            else if(n==3||((n>>1)&1)==0)
                n--;
            else
                n++;
            count++;
        }
        return count;
    }
};

北邮教务系统评教脚本

Published on September 17, 2017

72.Edit distance

Published on September 17, 2017