千问 LeetCode 50. Pow(x, n) Rust实现

📅 发布时间:2026/9/7 21:41:28
千问    LeetCode 50. Pow(x, n) Rust实现 在 Rust 中实现 LeetCode 50. Pow(x, n)核心思路依然是快速幂算法二分求幂将时间复杂度从 O(n) 优化到 O(log n)。这道题在 Rust 中有一个非常经典的“坑”题目给定的 n 是 i32 类型其取值范围是 [-2^31, 2^31 - 1]。如果 n -2^31即 i32::MIN直接对其取反 -n 会导致整数溢出因为正数最大只能到 2^31 - 1。因此我们需要将 n 转换为 i64长整型来进行安全的绝对值计算。下面为你提供两种 Rust 实现解法一递归实现最直观体现分治思想impl Solution {pub fn my_pow(x: f64, n: i32) - f64 {// 1. 将 i32 转为 i64防止 n -2^31 时取反溢出let N n as i64;// 2. 处理负指数x^(-n) 1 / x^n if N 0 { return 1.0 / Self::quick_pow(x, -N); } Self::quick_pow(x, N) } fn quick_pow(x: f64, n: i64) - f64 { // 3. 递归终止条件 if n 0 { return 1.0; } // 4. 分治先计算 x^(n/2) let half Self::quick_pow(x, n / 2); // 5. 合并结果根据 n 的奇偶性决定是否需要多乘一个 x if n % 2 0 { half * half } else { half * half * x } }}解法二迭代实现最优避免递归栈开销利用位运算来检查 n 的最低位在循环中完成快速幂。impl Solution {pub fn my_pow(x: f64, n: i32) - f64 {let mut N n as i64;let mut x x;// 1. 处理负指数 if N 0 { x 1.0 / x; N -N; } let mut result 1.0; let mut current_product x; // 2. 循环直到 N 变为 0 while N 0 { // 如果 N 的最低位是 1说明需要乘上当前的 current_product if N 1 1 { result * current_product; } // 将 x 平方对应指数减半 current_product * current_product; // N 右移一位相当于 N / 2 N 1; } result }} Rust 核心要点解析i32 到 i64 的类型转换这是这道题在 Rust/C/Java 中最重要的边界处理。let N n as i64; 完美规避了 i32::MIN 取反时的 PanicRust 在 Debug 模式下遇到整数溢出会直接报错。f64 的不可变性Rust 中变量默认是不可变的Immutable。在迭代法中因为我们需要修改 x 的值x 1.0 / x所以必须使用 let mut x x; 将其声明为可变变量。位运算的妙用N 1 1 等价于 N % 2 ! 0N 1 等价于 N / 2。位运算在底层执行效率更高且语义上更贴合“二进制分解”的快速幂本质。复杂度分析时间复杂度O(log n)循环或递归的次数等于 n 的二进制位数。空间复杂度递归法为 O(log n)系统调用栈迭代法为 O(1)。如果你刚做完这道题强烈建议去体验一下 LeetCode 372. 超级次方它结合了快速幂和模运算是对这道题思想的绝佳进阶