每天一题LeetCode【第37天】

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天】)