[路飞]_1342. 将数字变成 0 的操作次数

874 阅读1分钟

「这是我参与2022首次更文挑战的第15,活动详情查看:2022首次更文挑战

1342. 将数字变成 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 。

示例 3:

输入:num = 123
输出:12  

提示:

0 <= num <= 10^6

迭代解法

迭代解法分析

根据题意我们可以知道num是一个正整数,当num是个偶数则除以2,奇数的话就减1,直至num为0的时候结束。

我们可以通过while循环不停的按照条件进行处理,直至num为0的时候停止。

迭代解法逐步实现

首先先判断num是否为0,如果为0的话则直接返回结果。

if(num === 0) return num

我们定一个 count 变量用于统计将数字变成 0 的操作次数,初始化值为0。

let count = 0

使用while循环,每次执行时,把count进行加1操作。执行时通过 num % 2 是否为0来判断是否是偶数,如果是偶数的话就除以2,如果是奇数则减1。

while (num) {
    if(num % 2 === 0){
        num = num / 2
    }else{
        num = num - 1
    }
    count++
}

最后返回我们统计的数count


return count

迭代解法完整代码实现

/**
 * @param {number} num
 * @return {number}
 */
var numberOfSteps = function (num) {
    if(num === 0) return num
    let count = 0
    while (num) {
        if(num % 2 === 0){
            num = num / 2
        }else{
            num = num - 1
        }
        count++
    }
    return count
};

位运算+递归解法

位运算+递归解法分析

根据题意我们可以知道num是一个正整数,当num是个偶数则除以2,奇数的话就减1,直至num为0的时候结束。

我们可以通过while循环不停的按照条件进行处理,直至num为0的时候停止。

位运算+递归解法逐步实现

首先先判断num是否为0,如果为0的话则直接返回结果。

if(num === 0) return num

首先我们可以通过按位与来判断是否是偶数

if ((num & 1) == 0) {
} else {
}

当是偶数的时候我们可以使用位运算中的右移一位num >> 1来实现除以2,

if ((num & 1) == 0) {
    return 1 + numberOfSteps(num >> 1);
}

当是奇数的时候我们则减一

if ((num & 1) == 0) {
    return 1 + numberOfSteps(num >> 1);
}else {
    return 1 + numberOfSteps(num--); 
}

位运算+递归解法完整代码实现

/**
 * @param {number} num
 * @return {number}
 */
var numberOfSteps = function (num) {
  if (num == 0) return 0;
  if ((num & 1) == 0) {
    return 1 + numberOfSteps(num >> 1);
  } else {
    return 1 + numberOfSteps(num--); 
  }
};