位运算的结合是这题的一大亮点,随着刷题的增多,一拿到题目首先想到的特殊情况有:
1.既然是树的整数次方,很可能又是大数,所幸的是题目说了不要求
2.底数如果是负数的,那么返回值的正负会受到幂的奇偶性影响
3.幂是负的,返回值就是倒数了,这个情况可以立个flag来解决
4.(最重要的情况反而遗漏了),0的0次方没有意义,exponent为0返回1,exponent为1返回本身
剑指offer给出的很亮的正常情况解法思路:
1.如果exponent是偶数,那么正好可以看做两个幂为exponent/2的元素相乘,位运算表示就是右移一位2^4=2^2 * 2^2
2.如果exponent是奇数,那么减1就是偶数,然后按照处理偶数的思路来,对于幂减一需要给最终结果乘一次base,如
2^5 = 2^4 * 2 =(2^2) * (2^2) * 2
python代码
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# write code here
flag = 0
if exponent == 0:
return 1
if exponent == 1:
return base
if exponent < 0:
flag = 1
exponent = -1 * exponent
res = self.Power(base,exponent >> 1)
res *= res
if (exponent & 1 == 1):
res *= base
if flag == 1:
res = 1/res
return res
java版,最近发现我的java代码带有浓厚的Python风格。。。。。。
public class Solution {
public double Power(double base, int exponent) {
int flag = 0;
if(exponent == 0){
return 1;}
if(exponent == 1){
return base;
}
if(exponent < 0){
flag = 1;
exponent = (-1) * exponent;
}
double res = this.Power(base,exponent >> 1);
res *= res;
if((exponent & 1)== 1){
res *= base;
}
if(flag == 1){
res = 1.0/res;
}
return res;
}
}