美文网首页
每天一题LeetCode【第37天】

每天一题LeetCode【第37天】

作者: 草稿纸反面 | 来源:发表于2017-04-04 00:09 被阅读59次

    T50. Pow(x, n)【Medium

    题目

    写一个 pow(x,n) 方法。

    思路

    pow(x,n) 方法就是算 x 的 n 次方。

    分为三种情况:

    ① n=0 时:

    返回 1

    ② n>0 时:

    一般想补救是一个个乘起来嘛,但是简单的乘起来可能超时。

    这里用递归时间复杂度比较低,

    就是比如 3 的 5 次方,不要用 3×3×3×3×3,而是 3×(3×3)²

    若 n 偶数和奇数时处理方法不一样,看代码就好~

    ③ n<0 时:

    把 x=1/x ,n = -n, 这样以后就和 情况 ② 一样了

    代码

    代码取自 Top Solution,稍作注释

    public double myPow(double x, int n) {
           //等于0返回1
           if(n == 0)
                return 1;
            //小于0, x取反,变成和正的时候的一样
            if(n<0){
                n = -n;
                x = 1/x;
                //解决MIN_VALUE的问题
                if (n == Integer.MIN_VALUE) {
                    n = Integer.MAX_VALUE;
                    x *= x;
                }
            }
            //递归,注意对偶数和奇数的处理
            return (n%2 == 0) ? myPow(x*x, n/2) : x*myPow(x*x, n/2); 
        }
    

    补充

    一定会有人不明白下面代码的用意(就和之前的我一样哈哈哈):

    //解决MIN_VALUE的问题
    if (n == Integer.MIN_VALUE) {
         n = Integer.MAX_VALUE;
         x *= x;
    }
    

    大家都记得老师似乎讲过的 int 的范围:-2147483648 ~ +2147483647

    细心的人会发现负的要多一个数,因为右边的编码有一个给 0 了。

    我运行了一下,下面的程序

       System.out.print(-2147483648);    --》-2147483648
       System.out.print(-(-2147483648)); --》-2147483648
    

    两个输出是一样的,所以这里要另行处理。

    当 n == Integer.MIN_VALUE 时,取反就用 n= Integer.MAX_VALUE,
    因为数字够大,所以一般不用管它们两个实际差一那么一点点的差别。

    相关文章

      网友评论

          本文标题:每天一题LeetCode【第37天】

          本文链接:https://www.haomeiwen.com/subject/jzqaottx.html