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,
因为数字够大,所以一般不用管它们两个实际差一那么一点点的差别。
网友评论