刷题系列之1342. 将数字变成 0 的操作次数

222 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

前言

题目来源

leetcode.cn/problems/nu…

题目介绍

给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。

image.png

题目分析

这道题比较短,可以很容易分析出来,按照语句题目理解 非负整数、变成0、所需步数。

根据规则 分为偶数和奇数做不同的计算。

1.为偶数,要除以2;

2.为奇数,要减去1;

直到为0。因此我们可以知道使用个while循环,直到num=0。

题目解答

class Solution {
    public int numberOfSteps(int num) {
        int step=0;
        while(num>0){
            step++;
            if(num % 2==0){
                num=num/2;
            }else{
                num=num-1;
            }
        }
        return step;
    }
}

因为我们要统计的是步骤数,所以一开始应该先定义一个step变量存储步骤,每次while循环都累加一次,最后不满足条件跳出循环,这时候step就是所求的步骤了。

按照题目要求,我们只需要一个ifelse语句就能达到条件,执行代码得到如下

image.png

image.png

完全符合计算结果。

官方答案验证

class Solution {
    public int numberOfSteps(int num) {
        int ret = 0;
        while (num > 0) {
            ret += (num > 1 ? 1 : 0) + (num & 0x01);
            num >>= 1;
        }
        return ret;
    }
}

官方是用num与1进行位运算计算奇偶性,这种方式效率会更高。

image.png 同样的能执行完成。

位运算

首先我们应该知道程序中的所有数在计算机内存中都是以二进制的形式储存的。

位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。

举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。

所以运算的时候如果能进行位运算,效率是会更高的。

总结

这道题也是简单程度,根据题目逻辑,用程序语言表达出来即可满足,没有涉及太多的运算。