LeetCode 397. 整数替换

题目内容:

给定一个正整数 n,你可以做如下操作:

1. 如果 n 是偶数,则用 n / 2替换 n。
2. 如果 n 是奇数,则可以用 n + 1或n - 1替换 n。
n 变为 1 所需的最小替换次数是多少?

示例 1:

输入:
8

输出:
3

解释:
8 -> 4 -> 2 -> 1
示例 2:

输入:
7

输出:
4

解释:
7 -> 8 -> 4 -> 2 -> 1
或
7 -> 6 -> 3 -> 2 -> 1

 解题思路:

1.按着输入的数是偶数还是奇数分类讨论
2.如果是偶数的话就直接减半
3.如果是奇数的话,就需要判断这个数是加一还是减一。
4.具体是加一还是减一的判断原则是这个数的在经过操作以后能不能尽量多的倍2整除,也就是说将这个数转成二进制的话,其末尾的两位数是否是“11”或者“01”,如果是“11”的话(注意这里要排除3这个数),让其加一这样就能够实现两次除法,如果是“01”的话,就将其减一。

具体的实现代码如下:

Python3实现代码:

class Solution:
    def integerReplacement(self, n):
        """
        :type n: int
        :rtype: int
        """
        time = 0
        while n > 1:
            if n%2==0:
                n = n//2
            else:
                if bin(n)[-2:] == "11" and n !=3:
                    n+=1
                elif bin(n)[-1:] == "1":
                    n-=1
            time += 1
        return time

提交结果:

原文地址:https://www.cnblogs.com/andingding-blog/p/10222724.html