leetcode 实现乘方 - pow(x,y)

leetcode(java实现)


问题描述:

50.pow(x,y)
Implement pow(x, n), which calculates x raised to the power n (x^n).

Example 1:
Input: 2.00000, 10
Output: 1024.00000
Example 2:Input: 2.10000, 3
Output: 9.26100
Example 3:Input: 2.00000, -2
Output: 0.25000
Explanation: 2^(-2) = 1/22 = 1/4 = 0.25
Note:
  • -100.0 < x < 100.0
  • n is a 32-bit signed integer, within the range [−2^31, 2^31 − 1]

问题分析:

  • 【思路1-Java】递归实现

    采用递归实现,那么本题的终止条件是 n == 0 和 n == 1。这里不采用下面的做法,因为时间复杂度为 O(n),加上题目的限制会超时。
    public class Solution {
    public double myPow(double x, int n) {
    if(n == 0) return 1;
    if(n == 1) return x;
    return myPow(x, n-1) * x;
    }
    }
    另外,本题的难点主要是在边界条件:如果 n < 0,是不是 n = -n, x = 1 / x ,再进行递归就能解决了呢?如果 n = Intege.MIN_VALUE,n = -n 会出现溢出,怎么办呢?我们可以先将 n / 2 赋值给 t,再将 t = -n,就不会出现溢出问题。

  • 【思路2-Java】非递归实现

    m^n的理解:加入 n = 13,13在二进制中表示为:00001101,那么13 = 2^3 + 2^2 + 2^0。

算法实现:

参考代码:

用方法二来实现

class Solution {
    public double myPow(double x, int n) {
        int exp = n<0 ? -n-1 : n;   //边界和负值处理
        double product = 1;     //记录结果
        for (double tmp = x; exp > 0; exp>>=1)
        {
            if ((exp&1) != 0)
                product *= tmp;     //如果二进制位为1,则计算
            tmp *= tmp;     //记录中间结果
        }
        return n<0 ? 1/product/x : product;     //正负及边界处理
    }
}
全部评论

相关推荐

06-27 18:53
门头沟学院 Java
这样才知道自己不适合搞代码,考公去咯
只爱喝白开水:我也发现不适合搞代码,打算转非技术方向了
点赞 评论 收藏
分享
king122:专业技能不要写这么多,熟悉和熟练你经不住问,排版有些难看,中间的空隙搞小一点,项目描述的话感觉是从课程中抄下来的,改一改吧,不然烂大街了,每个项目都写一两点,用什么技术实现了什么难点,然后再写一些数字上去像时间又花了90%这样,这样面试会多一些,如果觉得自己的项目还是不够用的话,我有几个大厂最近做过的实习项目,感兴趣的话可以看我简介中的项目地址
点赞 评论 收藏
分享
一表renzha:手写数字识别就是一个作业而已
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务