一. 题目
-
题目
给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。 -
示例
二. 方法一
-
解题思路
-
解题代码
def numberOfSteps(self, num: int) -> int: count = 0 while num > 0: if num % 2 == 0: num /= 2 else: num -= 1 count += 1 return count
-
分析
时间复杂度: O(logn)
空间复杂度: O(1)
三. 方法二: 位运算
-
解题思路
和方法1思路差不多 -
解题代码
def numberOfSteps (self, num: int) -> int: count = 0 while num > 0: if num % 2 == 0: num >>= 1 else: num ^= 1 count += 1 return count
-
分析
时间复杂度: O(logn)
空间复杂度: O(1)
四. 方法三
-
解题思路
- 先将数字转成二进制数
- 操作的次数 = 二进制数的长度 + 二进制数中1的个数 - 1
- 二进制数中1的个数: 就等于奇数时减一操作的次数
- 二进制数的长度 - 1: 就等于偶数时除2时(移位)操作的次数
- 减1的原因是: 最左侧的1变成0后就不用再判断了, 所以次数需要减1
- 代码中减3的原因是: 数字转成二进制数后, 前面是以"ob"开头, 所以要减去2, 综合第5, 就需要减去3
-
解题代码
def numberOfSteps (self, num: int) -> int: bin_num = bin(num) size = len(bin_num) count = bin_num.count('1') return size + count - 3
-
分析
时间复杂度: O(n)
空间复杂度: O(1)