题目
难度:★★☆☆☆
类型:数组
方法:数学
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
给定一个正整数 n,你可以做如下操作:
- 如果 n 是偶数,则用 n / 2替换 n。
- 如果 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或者-1,为了最快到达1,也就是获得2的倍数还是4的倍数的问题,我们希望尽可能除以2的次数多一些,因此我们选择构造4的倍数,也就是要查看二进制最后两位数字,但是需要注意3这个特殊情况。这里直接给出思路:
用二进制来处理这个整数。
如果整数是偶数,直接将这个偶数除以2;
如果整数是大于3的奇数,并且除以4后余3(也就是倒数第二位也是1),那么将这个奇数+1;
如果整数是奇数,并且除以4以后余1(也就是倒数第二位是0),那么这个奇数-1。
依据上面的规则,循环遍历,直到整数变为3为止。
class Solution:
def integerReplacement(self, n: int) -> int:
bin_n = bin(n)[2:]
count = 0
while bin_n != '1':
if bin_n[-1] == '0':
bin_n = bin_n[:-1]
else:
if bin_n[-2] == '1' and bin_n != '11':
bin_n = bin(int(bin_n, 2)+1)[2:]
else:
bin_n = bin(int(bin_n, 2)-1)[2:]
count += 1
return count
如有疑问或建议,欢迎评论区留言~
有关更多力扣中等题的python解决方案,请移步力扣中等题解析
网友评论