将数字变成 0 的操作次数
难度:
标签:
题目描述
代码结果
运行时间: 18 ms, 内存: 16.2 MB
/*
* 思路:
* 1. 使用 IntStream.iterate 生成一个数字流,每次按题意的规则转换 num。
* 2. 计算出满足 num == 0 的元素的索引,即为需要的步数。
*/
import java.util.stream.IntStream;
public class Solution {
public int numberOfSteps(int num) {
return (int) IntStream.iterate(num, n -> n != 0, n -> n % 2 == 0 ? n / 2 : n - 1).count() - 1;
}
}
解释
方法:
题解的思路是通过模拟操作来逐步将输入的数字减少到0。具体做法是使用一个循环来反复检查数字的奇偶性。如果数字是偶数,就将其除以2;如果是奇数,则将其减1。每执行一次操作,计数器就增加1。循环持续进行,直到数字变为0为止。
时间复杂度:
O(log n)
空间复杂度:
O(1)
代码细节讲解
🦆
在实现中你使用了整除`num = num / 2`,为何不使用位运算`num >>= 1`来优化性能?
▷🦆
为什么在算法中选择了使用while循环而不是递归方式实现?
▷🦆
如果`num`的初始值为0,该算法是否仍然有效,是否有必要处理这种特殊情况?
▷