给你一个整数 n,你需要重复执行多次下述操作将其转换为 0 :
翻转 n 的二进制表示中最右侧位(第 0 位)。
如果第 (i-1) 位为 1 且从第 (i-2) 位到第 0 位都为 0,则翻转 n 的二进制表示中的第 i 位。
返回将 n 转换为 0 的最小操作次数。
示例 1:
输入:n = 0
输出:0
示例 2:
输入:n = 3
输出:2
解释:3 的二进制表示为 “11”
“11” -> “01” ,执行的是第 2 种操作,因为第 0 位为 1 。
“01” -> “00” ,执行的是第 1 种操作。
思路:
定义dfs(x)为x变到0的步数
大致两种情况
第一种数字为
11XXX时把XXX变为全0,然后变为1000
即dfs(11XXX)=dfs(XXX)+1+dfs(1000)
第二种数字为
10XXX这时先把XXX变为100然后变为11100此时和第一种数字一致了,按照第一种情况运算即可。
mp={};
class Solution:
def dfs(self,x:int) -> int:
if x<=1:
return x
if x==2:
return 3
if x==3:
return 2
if x in mp.keys():
return mp[x]
bit=1
a=1<<bit
while a<=x:
bit +=1
a=1<<bit
b=1<<(bit-2)
c=b-1
if x&b!=0:
now1=self.dfs(c&x)+1+self.dfs(b)
else:
d=1<<(bit-3)
y=(1<<(bit-1))+(1<<(bit-2))+(1<<(bit-3))
now1=abs(self.dfs(c&x)-self.dfs(d))+1+self.dfs(c&y)+1+self.dfs(b)
mp[x]=now1
return mp[x]
def minimumOneBitOperations(self, n: int) -> int:
return self.dfs(n)