leetcode
leetcode 1 ~ 50
Pow(x, n)

Pow(x, n)

难度:

标签:

题目描述

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。

 

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

 

提示:

  • -100.0 < x < 100.0
  • -231 <= n <= 231-1
  • n 是一个整数
  • 要么 x 不为零,要么 n > 0
  • -104 <= xn <= 104

代码结果

运行时间: 36 ms, 内存: 14.8 MB


/*
 * 题目思路:
 * 使用 Java Stream 实现 pow(x, n) 函数。
 * 由于 Stream 不能直接用于指数运算,我们可以使用递归方式或者自定义操作来实现。
 * 这里使用传统方法来完成题目要求,因为 Stream 的优势在于并行计算和集合操作。
 */
public class Solution {
    public double myPow(double x, int n) {
        if (n == 0) return 1;
        long N = n;
        if (N < 0) {
            x = 1 / x;
            N = -N;
        }
        return powHelper(x, N);
    }
 
    private double powHelper(double x, long n) {
        if (n == 0) return 1;
        double half = powHelper(x, n / 2);
        if (n % 2 == 0) {
            return half * half;
        } else {
            return half * half * x;
        }
    }
}

解释

方法:

该题解使用快速幂算法,通过二分法将幂次 n 分解,每次将 n 除以2,同时将底数 x 平方,直到 n 为0。若 n 为奇数,则将当前答案乘以底数 x。最终得到 x 的 n 次幂结果。若 n 为负数,则先将 x 取倒数,同时将 n 取相反数,转化为正数的情况。

时间复杂度:

O(log n)

空间复杂度:

O(1)

代码细节讲解

🦆
在快速幂算法中,为什么选择每次对n进行二进制右移操作?这样的操作有什么特别的好处吗?
快速幂算法通过每次对 n 进行二进制右移操作(即除以2),可以有效地减少计算量。每次右移都对应于将问题规模减半,因此算法的时间复杂度是对数级别的,即 O(log n)。这种方法使得每次只需处理当前的最低位,从而简化了幂次的处理,使算法既高效又易于实现。
🦆
在处理n为负数的情况时,为什么要将x取倒数并将n取相反数?这种操作对算法的结果有何影响?
当 n 为负数时,x 的 n 次幂实际上是 1/(x 的 |n| 次幂)。为了使用快速幂算法计算正幂次,我们将 x 取倒数,这样 x 的 -n 次幂就转化为了 (1/x) 的 n 次幂。随后将 n 取相反数,使其变为正数,这样可以利用相同的幂次计算过程。这种操作让算法能够统一处理正数和负数幂次的情况,保证了算法的正确性和通用性。
🦆
快速幂算法中,如果n的二进制表示中有多个1,例如n = 11(二进制为1011),算法是如何确保正确计算x的n次幂的?
在快速幂算法中,每次处理 n 的最低位,并根据这一位是否为 1 来决定是否将当前的 x 值(已经平方了若干次的)乘入最终结果 ans 中。对于 n = 11,其二进制为 1011,算法会在 n 的每一位是 1 的时候乘以当前的 x 值。具体过程中,x 会不断平方,对应于 n 的每次右移,这样每个二进制位都对应一个 x 的幂次,确保了算法能够正确地累乘所有必要的 x 的幂次,从而得到正确的结果。
🦆
在代码中使用`if n & 1 != 0`来检查n的最低位是否为1,这种方法与直接检查n是否为奇数有什么不同?
使用 `if n & 1 != 0` 来检查 n 的最低位是否为 1 是一种直接且效率较高的位操作方法,它直接对 n 的二进制表示的最低位进行检测。这一操作与检查 n 是否为奇数本质上是相同的,因为整数的奇偶性由其最低位的二进制决定。然而,使用位操作更直接地表达了这一逻辑,且在某些编程环境中可能比标准的奇偶性检查更快,因为它避免了任何额外的比较逻辑,只涉及基本的位运算。

相关问题

x 的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5

 

示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

 

提示:

  • 0 <= x <= 231 - 1

超级次方

你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。

 

示例 1:

输入:a = 2, b = [3]
输出:8

示例 2:

输入:a = 2, b = [1,0]
输出:1024

示例 3:

输入:a = 1, b = [4,3,3,8,5,2]
输出:1

示例 4:

输入:a = 2147483647, b = [2,0,0]
输出:1198

 

提示:

  • 1 <= a <= 231 - 1
  • 1 <= b.length <= 2000
  • 0 <= b[i] <= 9
  • b 不含前导 0