LeetCode第五十题—Python实现


title: LeetCode No.50

categories:

  • OJ
  • LeetCode

tags:

  • Programing
  • LeetCode
  • OJ

LeetCode第五十题

题目描述

现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:

输入:x = 2.10000, n = 3
输出:9.26100
示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
 

提示:

-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104

代码

class Solution(object):
    def TimeOut(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float

        核心思想:
                1. 第一种方法,有一个测试用例超时了
                如果n小于0的话,则使用1/x,重复n次
                如果n大于0的话,则使用1*x 重复n次
                如果n等于0的话,返回1
                注意结果要保留5位小数, 结果类型为float

                2. 第二种方法,采用快速幂方法
        """
        if n == 0:
            return 1.0000

        result = float(1.0000)
        flag = True
        if n < 0:
            flag = False
        for i in range(abs(n)):
            if flag:
                result = result * x
            else:
                result = result / x

        return float(format(result,'.5f'))

    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float

        核心思想:
                1. 第一种方法,有一个测试用例超时了
                如果n小于0的话,则使用1/x,重复n次
                如果n大于0的话,则使用1*x 重复n次
                如果n等于0的话,返回1
                注意结果要保留5位小数, 结果类型为float

                2. 第二种方法,采用快速幂方法
                快速幂算法能帮我们算出指数非常大的幂,传统的求幂算法之所以时间复杂度非常高(为O(指数n)),
                就是因为当指数n非常大的时候,需要执行的循环操作次数也非常大。
                所以我们快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。
                这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。

                3^10=3*3*3*3*3*3*3*3*3*3

                //尽量想办法把指数变小来,这里的指数为10

                3^10=(3*3)*(3*3)*(3*3)*(3*3)*(3*3)

                3^10=(3*3)^5

                3^10=9^5
        """
        # 由于python递归和其他语言的递归调用方式不用,因此需要单独声明一个新的函数来进行递归调用
        def call_pow(x,n):
            # 采用递归方式调用
            if n == 0:
                return 1.0
            elif n > 0 and n % 2 == 0:  # 如果指数可以被2取余为0,则x变平方 指数除2  比如: 3^4 变成(3^2)^2 = (3*3)^2
                return call_pow(x * x, n / 2)
            elif n > 0:
                return call_pow(x, n - 1)*x  # 如果n不能被2整除,则减一
            else:
                return 1 / call_pow(x, -n)  # 单独处理n为负数的情况

        return float(format(call_pow(x,n),'.5f'))



if __name__ == '__main__':
    s = Solution()
    print(s.myPow(x = 8.88023, n = 3))

猜你喜欢

转载自blog.csdn.net/qq_16184125/article/details/114633092
今日推荐