题目来源于力扣(LeetCode)
一、题目
题目相关标签:位运算
提示:
0 <= num <= 10^6
二、解题思路
2.1 位运算方式
-
找规律:数字的二进制形式中 (位数 + 1 的个数)- 1
减 1 是因为最后一位二进制位 1 变成 0 后不需要再进行右移位的操作了,因为最后一位二进制位 1 变成 0 后,该数值已经为 0
2.2 递归方式
-
根据题目提示来模拟实现
-
用递归方式来用代码代替文字表达
-
为偶数时,除 2 操作
-
为奇数时,减 1 操作
-
最后为零时,返回零,结束递归
三、代码实现
3.1 位运算方式
public static int numberOfSteps(int num) {
if (num == 0) {
return 0;
}
int count = 0;
while (num > 0) {
if ((num & 1) == 1) {
// 位为 1 时需要加 1(步操作)
count++;
}
num >>= 1;
// 右移位时需要加 1(步操作)
count++;
}
// 因为最后只剩 1 位时,从 1 变成 0 只需 1 次,而无需再进行一次移位操作了
return count - 1;
}
3.2 递归方式
public static int numberOfSteps(int num) {
if (num == 0) {
return 0;
}
if (num % 2 == 1) {
// 为奇数时,减 1 操作
return 1 + numberOfSteps(num - 1);
} else {
// 为偶数时,除 2 操作
return 1 + numberOfSteps(num / 2);
}
}
四、执行用时
4.1 位运算方式
4.2 递归方式
五、部分测试用例
public static void main(String[] args) {
// int num = 14; // output:6
// int num = 8; // output:4
int num = 123; // output:12
// int num = 0; // output:0
// int num = 1; // output:1
int result = numberOfSteps(num);
System.out.println(result);
}