「这是我参与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--);
}
};