问题:
难度:easy
说明:
给出一个 int 整形 a,如果 a 是偶数,就将 a / 2,如果是奇数就将 a - 1,一直处理到 int a = 0
问题链接:https://leetcode.com/problems/number-of-steps-to-reduce-a-number-to-zero/
输入范围:
a 为 正整数 , a < Integer.MAX_VALUE。
输入案例:
// 14偶数:14 / 2 = 7
// 7奇数:7 - 1 = 6
// 6偶数:6 / 2 = 3
// 3奇数:3 - 1 = 2
// 2偶数:2 / 2 = 1
// 1奇数:1 - 1 = 0
// 一共 6 步
Input: num = 14
Output: 6
Explanation:
Step 1) 14 is even; divide by 2 and obtain 7.
Step 2) 7 is odd; subtract 1 and obtain 6.
Step 3) 6 is even; divide by 2 and obtain 3.
Step 4) 3 is odd; subtract 1 and obtain 2.
Step 5) 2 is even; divide by 2 and obtain 1.
Step 6) 1 is odd; subtract 1 and obtain 0.
我的代码:
很简单的题,不过如果要尽量快,可以用位运算。
比如:14 二进制为 1 1 1 0
那么 1 1 1 0 是 0 结尾, 14 >> 1 = 1 1 1,需要 1 次操作。
1 1 1 是 1 结尾,1 1 1 - 1 = 1 1 0, 1 1 0 >> 1 = 11 需要 2 次操作。
可以发现,如果 0 结尾,去掉尾部 1 此操作,1 结尾 去掉尾部 2 次操作。如果 1 是整形的头部,就需要 1 次 操作。
因此 14 = 1 1 1 0 = 1 + 2 * 2 + 1 = 6 次操作
class Solution {
public int numberOfSteps (int num) {
// 少于 3 的都可以不处理
if(num < 3) return num;
int step = 0;
while(num != 0) {
step ++;
// & 操作 相当于尾部 1 & 1 = 1; 0 & 1 = 0,相当于判断是否增加操作步数
step += num & 1;
// 除 2 快速操作
num >>= 1;
}
// 最后都要排除 头部 多出一次操作
return step - 1;
}
}