- 方法1,使用数学解法
- 首先要转为浮点数,然后使用 4 作为底求对数,判断拿到的结果是不是整数即可
- 和 js 不同,Rust 不需要换底公式
- 方法2,基于2进制
- 4 的幂有一个特点,就是转为二进制的话,它只有 1 个 1,而且 1 之后的 0 的个数为偶数
方法 1
impl Solution {
pub fn is_power_of_four(n: i32) -> bool {
// 负数和 0 直接跳过
if n <= 0 {
return false;
}
// 求对数
let lg = (n as f64).log(4.0);
// 和取整的结果做对比即可,此处也可以换成 floor、ceil、round 等方法
lg == lg.trunc()
}
}
方法2
impl Solution {
// 简洁了很多,效率也更高
pub fn is_power_of_four(n: i32) -> bool {
// count_ones() 拿到二进制中 1 的数量
// trailing_zeros() 计算结尾处 0 的个数
n > 0 && n.count_ones() == 1 && n.trailing_zeros() % 2 == 0
}
}
assert_eq!(is_power_of_four(-4), false);
assert_eq!(is_power_of_four(0), false);
assert_eq!(is_power_of_four(1), true);
assert_eq!(is_power_of_four(5), false);
assert_eq!(is_power_of_four(16), true);