1342. 将数字变成 0 的操作次数 | 刷题打卡

220 阅读2分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述

本题来自1342. 将数字变成 0 的操作次数

image.png

二、思路分析

对2取余,区分奇偶数,返回得到0操作的次数. 有二进制转换内味儿。

三、AC代码

5中解法依次是:

1.遍历 对2取余 返回次数

var numberOfSteps = function(num) {
    for(let i=0; ; i++) {
        if(num == 0){
            return i;
        }else{
            if( num % 2 == 0){
                num = num / 2;
            }else{
                num = num - 1;
            }
        }
    }
}

2.递归 三目运算符 (我猜num >> 1可以当做除以2)

var numberOfSteps = function(num) {
    return num > 1 ? 1 + (num % 2) + numberOfSteps( num>>1 ) : num;
};

3.while (我猜num >> 1可以当做除以2)

var numberOfSteps = function(num) {
    let i = 0;
    while(num) {
        if(num % 2) num--;
        else num = num >> 1;
        i++;
    }
    return i;
};


4.replace() toString() 二进制

偶数的次数就是二进制的位数,奇数的次数就是除最高位以外的1的个数。

var str = num.toString(2);
return str.length + str.replace(/0/g,"").length - 1;

例如:8 二进制即 1000,共4位,所以总步数为4

image.png

例如:23 二进制即 10111,共5位,除最高位后面有3个1,所以总步数为8

image.png


4.递归

var numberOfSteps = function(num) {
    if(num==0){
        return 0
    }else if(num%2==0){
        return numberOfSteps(num/2)+1
    }else if(num%2==1){
        return numberOfSteps((num-1))+1
    }
};

4.二进制转换

看到这道题,就感觉有点像笔算10进制转2进制的过程,所以感觉可以利用这个过程来求解。 比如14转二进制是1110,其中有3个1,每个1代表一次除以2余1的操作,那么在题目中这属于两步(因为要多算一步减1),而0代表除以2余0,在题目中只有一步。

所以1,1,1,0 在题目眼中是这样的:2,2,2,1,直接累加起来,当然最后要减去最后一步已经是0的操作。 表达的可能不是很清楚,直接看代码,简单易懂。

var numberOfSteps = function(num) {
    return num.toString(2).split('').reduce((total, el) => Number(total) + Number(el) + 1, 0) - 1
};

四、总结

啊 我人没了