牛客网在线编程专题《剑指offer-面试题11》数值的整数次方

微信公众号

题目链接:

https://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00?tpId=13&tqId=11165&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述:

解题思路:

(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》,何海涛著。

发布了285 篇原创文章 · 获赞 892 · 访问量 111万+

猜你喜欢

转载自blog.csdn.net/program_developer/article/details/97048416