题目链接:
题目描述:
解题思路:
(1)利用Python的math模块解法
import math
class Solution:
def Power(self, base, exponent):
assert base != 0
return math.pow(base, exponent)
sol = Solution()
print(sol.Power(2, 3))
(2)简单的解法
class Solution:
def Power(self, base, exponent):
return base**exponent
sol = Solution()
print(sol.Power(2, -3))
(3)全面但是不够高效的解法
# 方法三:
'''
对于这道题目,需要考虑四种情况:
1、底数为0,指数为负数的情况,无意义。
2、指数为0,返回1。
3、指数为负数,返回 1.0/(base**-exponent)
4、指数正数,base**exponent。
'''
class Solution:
def Power(self, base, exponent):
if (base == 0) and exponent < 0:
return 0
if exponent == 0:
return 1
if exponent < 0:
result = self.powerWithExponent(1.0/base, -exponent)
else:
result = self.powerWithExponent(base, exponent)
return result
def powerWithExponent(self, base, exponent):
result = 1
for i in range(0, exponent):
result = result * base
return result
sol = Solution()
print(sol.Power(2, -3))
(4)全面又高效的解法
如果输入的指数exponent为32,我们在函数powerWithExponent的循环中需要做31次乘方。但我们可以换一种思路考虑:我们的目标是求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要在16次放的基础上再平方一次就可以了。而16次方又是8次方的平方。这样以此类推,我们求32次方只需要做5次乘方:先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。
也就是说,我们可以利用下面这个公示求a的n次方:
# 方法四:
class Solution:
def Power(self, base, exponent):
'''递归求解'''
if (base == 0) and exponent < 0:
return 0
absExponent = abs(exponent)
def calPow(base, absExponent):
if absExponent == 1:
return base
if absExponent == 0:
return 1
# 递归求次方
res = calPow(base, absExponent>>1)
res *= res
# 判断奇偶性
if (absExponent & 0x1) == 1:
res *= base
return res
result = calPow(base, absExponent)
if exponent < 0:
result = 1.0 / result
return result
sol = Solution()
print(sol.Power(2, -3))
最后再提醒一个细节:我们用右移运算符代替了除以2,用位与运算符代替了求余运算符(%)来判断一个数是奇数还是偶数。位运算的效率比乘除法及求余运算的效率要高很多。既然要优化代码,我们就把优化做到极致。
Reference:
【1】《剑指Offer》,何海涛著。