「这是我参与2022首次更文挑战的第6天,活动详情查看: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满足退出条件num = ,然后循环中有两种情况:
- num为偶数:将num除以二
- 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
};
递归解法
关于偶数时候的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;
};