题目
给你一个非负整数 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
解题思路
方法一
- 在
numberOfSteps
方法中,声明一个整数类型的变量steps
,用于记录步骤数,并初始化为 0。 - 进入
while
循环,条件为num != 0
,意味着当num
不等于 0 时,继续执行循环。 - 在循环中,首先判断当前的
num
是否为偶数,通过num % 2 == 0
来判断。如果是偶数,则将num
除以 2,相当于向下取整一次。 - 如果
num
不是偶数,即为奇数,那么将num
减去 1。 - 在每次操作后,步骤数
steps
自增 1。 - 循环结束后,返回最终计算得到的步骤数
steps
。
class Solution {
public int numberOfSteps(int num) {
int steps = 0;
while (num != 0) {
if (num % 2 == 0) {
num /= 2;
} else {
num -= 1;
}
steps++;
}
return steps;
}
}
方法二
- 首先,定义一个
steps
变量,用于记录步骤数,初始值为0。 - 进入循环,只要输入的整数
num
大于0,就执行以下操作:- 判断当前的
num
是偶数还是奇数。如果是偶数,说明可以直接将其除以2,步骤数加1;如果是奇数,需要先减1再除以2,步骤数加2。 - 根据奇偶性得到的步骤数累加到
steps
中。 - 将
num
右移1位,相当于除以2。
- 判断当前的
- 当
num
变为0时,循环结束。 - 返回
steps - 1
,因为最后一步操作不再需要减除,即将数字变为0不需要额外的步骤。
class Solution {
public int numberOfSteps (int num) {
int steps = 0; // 用于记录步数
while (num > 0) { // 当输入的数大于0时执行以下操作
// 如果当前数字为偶数,则除以2,步数加1;否则为奇数,减1再除以2,步数加2
steps += (num % 2 == 0) ? 1 : 2;
num >>= 1; // 将数字右移1位,相当于除以2
}
return steps - 1; // 返回步数减一,因最后一步操作将数字变为0而不需要额外步骤
}
}