将数字变成 0 的操作次数
问题:
给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。
思路:
第一种:
- 如果 num 为对 2 取余为 0,则 num 变为一半,否则减一,每次 count 计数器加一,直到 num == 0。
- 返回 count。
第二种:
- 位运算如果和 1 与运算,为 0 则 num 为奇数,二进制末位为 1,则与 -2 进行与运算相当于减一,否则右移一位相当于除 2。直到 num == 0。
- 返回 count。
低效 (4 ms)
class Solution {
public:
int numberOfSteps (int num) {
auto count = 0;
while(num > 0) {
if(num % 2 == 0) num /= 2;
else num--;
count++;
}
return count;
}
};
高效 (0 ms)
class Solution {
public:
int numberOfSteps (int num) {
auto count = 0;
while(num > 0) {
// -2 的二进制为 1111111111111111111111111111111111111111111111111111111111111110
num = num & 1 ? num & -2 : num >> 1;
count++;
}
return count;
}
};