随手一题:将数字变成 0 的操作次数

题目如下所示:
在这里插入图片描述
题目很简单,但是模拟操作过程很快就能得到结果,但是我觉得这种简单的题应该是会有一行代码解决的,因此我便尝试用一行代码来解这题。
因为操作过程中只有除以2和减1两个步骤,因此可以考虑用二进制位运算来处理。

我们来考虑一下二进制数字在进行上述两个操作时,数字是怎么变化的:
以6为例,二进制下6为110,除以2得到3,3用二进制表示为11,与6的二进制数相比,少了个0。
对3继续处理,减1得到2,用二进制表示为10,2除以2得到1,用二进制表示为1。
对于3的二进制数11,要变成1的话,需要进行两步操作;而对于6来说,把从110变成11只需要一步操作。因此我们可以认为二进制字符串中,0会带来1次操作,1会带来2次操作。因此可以通过这个特性来进行操作次数计算。

除了正常的方法以外,我还用了两种位运算的方法来解题:

class Solution:
    def numberOfSteps (self, num: int) -> int:
        #方法一:直接计数
        count = 0
        while num > 0:
            if num % 2 == 0:
                num /= 2
                count += 1
            else:
                num -= 1
                count += 1
        return count
        #方法二:用操作过程中二进制0和1的变化情况来计算,以1结尾时就要减一得到0,以0结尾除以2就相当于把0去掉了
        return bin(num).count("0") + 2 * bin(num).count("1") - 2
        #把上面的方法再简化一下
        return bin(num).count("1") + len(bin(num)) - 3

其实用位运算的速度并没有直接算那么快,由下而上依次对应代码中由上而下的方法:
在这里插入图片描述
在评论区中我觉得有一句话说的挺好的:别再简单的事情上浪费时间,过度优化是失败的第一步。这道题直接做就好了,并不需要过多复杂的方法。


版权声明:本文为weixin_40858097原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。