当前位置: 首页 > 后端技术 > Python

LeetCode397.整数替换

时间:2023-03-25 23:52:35 Python

描述给定一个正整数n,你可以做如下操作:如果n是偶数,将n替换为n/2。如果n是奇数,你可以将n替换为n+1或n-1.n变为1最少需要多少次替换?例1:Input:8Output:3Explanation:8->4->2->1Example2:Input:7Output:4Explanation:7->8->4->2->1or7->6->3->2->1描述给定一个正整数n,你可以这样做:如果n是偶数,将n替换为n/2。如果n是奇数,n可以用n+1或n-1代替。要使n变为1,最少需要多少次代入?示例1:输入:8输出:3解释:8->4->2->1示例2:输入:7输出:4解释:7->8->4->2->1或7->6->3->2->1来源:LeetCode链接:https://leetcode-cn.com/probl...版权属于LeetCode.com。商业转载请联系官方授权,非商业转载请注明出处。这个想法是除以2等小于将二进制数向右移动。假设有这样一个数0b1111,我们可以选择加1或者减1;0b1111+1-->0b10000-->右移4次;一共5次0b1111-1-->0b1110-->0b111-1-->0b110-->0b11-1-->0b10-->0b1;一共6个假设有0b11010b1101-1-->0b1100-->0b110-->0b11-1-->0b10-->0b10b1101+1-->0b1110-->0b111+1-->0b1000-->0b100-->0b10-->0b1加一就是减少这个数的二进制表示中1的个数(但是会产生1个左移);一位解释说此时“加1减1的效果被左移1抵消了”。规则:当数是2的倍数时,除以2;当数字的最后两位二进制为0b11时,加一;当号码的最后两位为0b01时,减一;唯一的例外是当数字正好是0b111#-*-coding:utf-8-*-#@Author:何瑞#@CreateDate:2019-08-2921:06:55#@LastModifiedby:何瑞#@LastModified时间:2019-08-2921:41:26class解决方案:defintegerReplacement(self,n:int)->int:count=0whilen>1:count+=1ifnotn%2:n>>=1elifn&0b11==0b11andn!=0b11:n+=1else:n-=1returncount源代码文件在这里。?