LeetCode 之 剑指 Offer 16. 数值的整数次方(Java)

文章目录

  • LeetCode 之 剑指 Offer 16. 数值的整数次方(Java)
    • 一、题目
    • 二、解题思路
      • 1.递归
      • 2.迭代
    • 三、代码
      • 1.递归
      • 2.迭代

LeetCode 之 剑指 Offer 16. 数值的整数次方(Java)

一、题目

剑指 Offer 16. 数值的整数次方

实现 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/2)^2 = 1/4 = 0.25

提示:

-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-zhi-de-zheng-shu-ci-fang-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

  首先朴素的菜鸟方法,正数用 for 循环累乘 n 个 x,负数则先将 x 取倒数再将 n 取绝对值,考虑特殊情况 x=0。然后不出意外的话就是超时了。

1.递归

  观察 x → x2 → x4 → x16 → x32 → x64 ,所以其实计算 x64 时很多地方没必要再次逐个计算了。首先对于负数就是计算 x-n 的倒数。正数就是不断计算 xn/2 ,如果 n 为奇数还需要再乘以 x。

2.迭代

  又是数学知识,首先整数的二进制拆分为:n = 2i0 + 2i1 + …… + 2ik,那么 xn = xm0 * xm1 * …… * xmk ,其中 mk = 2ik 。如果 x 二进制的第 k 位为 1 ,则需要纳入贡献。

注:本题计算方法又称快速幂方法。

三、代码

1.递归

class Solution {public double myPow(double x, int n) {long N = n;return N >= 0 ? quickMul(x, N) : 1/quickMul(x, -N);}public double quickMul(double x, long N){if(N == 0){return 1.0;}double y = quickMul(x, N/2);return N%2==0 ? y*y : y*y*x;}
}

2.迭代

class Solution {public double myPow(double x, int n) {long N = n;return N >= 0 ? quickMul(x, N) : 1/quickMul(x, -N);}public double quickMul(double x, long N){double ans = 1.0;// 记录每个项double x_con = x;while(N > 0){// 最后一位为1,纳入贡献if(N % 2 == 1){ans *= x_con;}x_con *= x_con;// 不断右移N /= 2;}return ans;}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部