0
点赞
收藏
分享

微信扫一扫

算法创作 | 将数字变成 0 的操作次数


微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章

问题描述

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


测试结果:


算法创作 | 将数字变成 0 的操作次数_leetcode

算法创作 | 将数字变成 0 的操作次数_leetcode_02

算法创作 | 将数字变成 0 的操作次数_leetcode_03

上述代码适合于大多数朋友的思路,本人也在其他地方找到了其他的思路,现在将代码分享给大家共勉:


class Solution:

def numberOfSteps (self, num: int) -> int:

          return bin(num).count('1') + num.bit_length() - 1


算法创作 | 将数字变成 0 的操作次数_python_04


当然本题的解法远不止以上两种,还有许多不同的解法,大家也可以多多思考,欢迎和笔者一起探讨。


结语

综上所述,对于一道题目,我们不能急于去写代码,而是要充分分析题目当中所蕴含的内容,认真思考,在写代码前要将整体思路分析清晰,甚至可以广角度地思考,因为同一道题大多数会有许多不同的解法,我们可以多多尝试不同的解法,拓展自己的思路,而不是常用一种方法或是一种思路,那样的话,久而久之就会限制自己的思维,形成思维定势,对自己思维的提高具有很大的局限性。

实习编辑:李欣容




举报

相关推荐

0 条评论