实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
提示:
-100.0 < x < 100.0
-2^31 <= n <= 2^(31-1)
-10^4 <= x^n <= 10^4
本题主要采用快速幂的思想做降幂操作,题目本身不难,但是数据范围有个小坑~
必须表扬一下 x=2, n=-2147483648
这一组测试用例。
这个用例决定了这里只能用无符号右移,有符号右移会有问题!
2147483648 = 2^31
===> 对应的二进制串为 ‘10000000000000000000000000000000’ ;
如果使用有符号右移的话,这里会被当作负数进行右移,答案就会出错。
/**
* @param {number} x
* @param {number} n
* @return {number}
*/
var myPow = function (x, n) {
if (x === 1 || x === 0) {
return x;
}
if (x === -1) {
return n & 1 ? x : -x;
}
return exp(x, n);
};
function exp(x, n) {
let res = 1,
base = n >= 0 ? x : 1 / x, t = Math.abs(n);
while (t > 0) {
if (t & 1) {
res *= base;
}
base *= base;
t >>>= 1;
}
return res;
}