就是求幂次方。
解法一
求幂次方,用最简单的想法,就是写一个 for 循环累乘。
至于求负幂次方,比如 2^{-10}2−10,可以先求出 2^{10}210,然后取倒数,1/2^{10}1/210 ,就可以了
doublemul=1; if (n>0) { for (inti=0; i<n; i++) { mul*=x; } } else { n=-n; for (inti=0; i<n; i++) { mul*=x; } mul=1/mul; }
但这样的话会出问题,之前在29题讨论过,问题出在 n = - n 上,因为最小负数 -2^{31}−231取相反数的话,按照计算机的规则,依旧是-2^{31}−231,所以这种情况需要单独讨论一下。
if (n==-2147483648) { return0; }
当然,这样做的话 -1 ,和 1 也需要单独讨论下,因为他们的任意次方都是 1 或者 -1
if (x==-1) { if ((n&1) !=0) { //按位与不等于 0 ,说明是奇数return-1; } else { return1; } } if (x==1.0) return1;
代码出来了
publicdoublemyPow(doublex, intn) { if (x==-1) { if ((n&1) !=0) { return-1; } else { return1; } } if (x==1.0) return1; if (n==-2147483648) { return0; } doublemul=1; if (n>0) { for (inti=0; i<n; i++) { mul*=x; } } else { n=-n; for (inti=0; i<n; i++) { mul*=x; } mul=1/mul; } returnmul; }
时间复杂度:O(n)。
总
从一般的方法,到递归,最后的解法,直接从 2 进制考虑,每一个数字,都可以转换成 2 的幂次的和,从而实现了最终的解法。
空间复杂度:O(1)。