微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。
问题描述
给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。
为了方便理解题意,下面给出两个示例:
示例 1:
输入:num = 14
输出:6
解释:
步骤 1) 14 是偶数,除以 2 得到 7 。
步骤 2) 7 是奇数,减 1 得到 6 。
步骤 3) 6 是偶数,除以 2 得到 3 。
步骤 4) 3 是奇数,减 1 得到 2 。
步骤 5) 2 是偶数,除以 2 得到 1 。
步骤 6) 1 是奇数,减 1 得到 0 。
示例 2:
输入:num = 8
输出:4
解释:
步骤 1) 8 是偶数,除以 2 得到 4 。
步骤 2) 4 是偶数,除以 2 得到 2 。
步骤 3) 2 是偶数,除以 2 得到 1 。
步骤 4) 1 是奇数,减 1 得到 0 。
解决方案
首先,由题意可知:题目要求给出一个非负整数num,返回将它变成零所需要的次数,并要求当数为偶数时,需要将其除以2,为奇数时,将其减去1。如此重复操作,直到将其变为0,最后返回操作的次数。
然后,我们再来找出里面的关键点:首先是num是一个非负整数,所以我们代码不需要对数的类型进行判断,其次是当这个数足够大的时候肯定会经过许多次减去1或者是除以2的操作,那么肯定会用到循环。我们再进一步思考,常用的循环主要有for循环和while循环,那么针对本道题目,选取哪一种循环更好呢?于是我们再进一步思考,for循环一般用于在知道循环次数的情况下,在目标循环次数内进行操作,而while循环一般用于不知道循环次数情况下,在条件范围内循环,满足条件后直接退出循环。可见,对比两种循环后,针对本道题目,选择while循环更合适。
最后,在确定循环后,不要着急写代码,题目中还有要求,当该数变成偶数时,需要除以2,为奇数时,需要减去1。所以,在while循环中,我们还需要加入判断语句。这样才能在题目要求范围内完成题目。
也许大家现在有一个疑问,for循环是在知道循环次数的情况下进行操作,进而很容易统计循环次数,但while循环是满足条件就跳出循环,要怎样统计循环次数呢?这个问题其实很简单,我们只需要在循环外定义一个初始值为0的变量,然后每循环一次就加1,这样在循环完成后,循环次数也就统计出来啦!
下面请看题解代码:
def math(): num = int(input('')) a = 0 while num != 0: if num % 2 == 0: num = num / 2 a = a + 1 elif num % 2 != 0: num = num - 1 a = a + 1 return a print(math()) |
测试结果:
上述代码适合于大多数朋友的思路,本人也在其他地方找到了其他的思路,现在将代码分享给大家共勉:
class Solution: def numberOfSteps (self, num: int) -> int: return bin(num).count('1') + num.bit_length() - 1 |
当然本题的解法远不止以上两种,还有许多不同的解法,大家也可以多多思考,欢迎和笔者一起探讨。
结语
综上所述,对于一道题目,我们不能急于去写代码,而是要充分分析题目当中所蕴含的内容,认真思考,在写代码前要将整体思路分析清晰,甚至可以广角度地思考,因为同一道题大多数会有许多不同的解法,我们可以多多尝试不同的解法,拓展自己的思路,而不是常用一种方法或是一种思路,那样的话,久而久之就会限制自己的思维,形成思维定势,对自己思维的提高具有很大的局限性。
实习编辑:李欣容