给你一个整数 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)