1342. 将数字变成 0 的操作次数(2022-1-31)
给你一个非负整数 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 。
解题思路
😊 临近新年的easy题,感觉心情都更好了!🥳
两个思路
其一:正常的对2取模判断奇偶数,奇数减一,偶数除二,次数累加
其二:通过位运算符>>
,其实每右移一位相当于,把“减一”,“除二”都做了;如果对2取模之后为1,那么此次操作就要累计两次(一次减一,一次除二)反之,此次操作只需要累计一次(一次除二)。
换种说法啊,将num
转化成二进制,他的末尾位是1,就说明当前是奇数,末尾位是0,就说明当前是偶数;也就是说,每个二进制位的1
都会带来两步的代价,每个二进制位的0
都会带来一步的代价。(除了num
为1的情况)
var numberOfSteps = function(num) {
let count = 0
// 方法一
// while(num != 0){
// count ++
// num = num & 1 ? num-1 : num / 2 | 0
// }
// 方法二
while(num != 0){
count += (num > 1 ? 1 : 0) + (num & 1)
num >>= 1
}
return count
};