leetcode刷题记录-1342. 将数字变成 0 的操作次数

298 阅读2分钟

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

前言

今日的题目为简单,但是很适合锻炼一下递归的解题思维。

每日一题

今天的每日一题为 1342. 将数字变成 0 的操作次数,难度为简单

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

示例 1:

输入:num = 14
输出:6
解释:
步骤 1) 14 是偶数,除以 2 得到 7 。
步骤 27 是奇数,减 1 得到 6 。
步骤 36 是偶数,除以 2 得到 3 。
步骤 43 是奇数,减 1 得到 2 。
步骤 52 是偶数,除以 2 得到 1 。
步骤 61 是奇数,减 1 得到 0

示例 2:

输入:num = 8
输出:4
解释:
步骤 18 是偶数,除以 2 得到 4 。
步骤 24 是偶数,除以 2 得到 2 。
步骤 32 是偶数,除以 2 得到 1 。
步骤 41 是奇数,减 1 得到 0

示例 3:

输入:num = 123
输出:12

提示:

  • 0 <= num <= 10^6

题解

模拟解法

今天的题目略微简单,通过模拟的思维,一直循环数字num,直到num满足退出条件num = ,然后循环中有两种情况:

  1. num为偶数:将num除以二
  2. num为奇数:num等于num减一 然后只需要一直循环,并且定义一个 i 纪录下循环的次数,结束循环后 i 就是题目需要的答案。
/**
 * @param {number} num
 * @return {number}
 */
var numberOfSteps = function(num) {
    let i = 0;
    while(num != 0){
        if(num % 2 == 1){
            num = num-1;
            i++
        }else{
            num = num/2;
            i++
        }
    }
    return i
};

image.png

递归解法

关于偶数时候的num除以二,我们其实是能够省去奇数的步骤的,因为当数为奇数的时候,我们只需要将num右移一位:num>>1这样就可以自动去掉奇数位,但是相应的,当num为奇数的时候位移一位,那么操作次数也要相应的多增加一次。

然后通过递归的思维,函数输入一个num,当条件不满足num > 1的时候,就将num向右位移一位,并且位移的时候要判断为奇数或者偶数,偶数的话操作次数加一,奇数的话操作次数加二,然后满足条件就可以将num = 1依次退出相加。

/**
 * @param {number} num
 * @return {number}
 */
var numberOfSteps  = function(num) {
    return num > 1 ? 1 + (num % 2) + numberOfSteps( num>>1 ) : num;
};

image.png