昨天,不知为何,初中同学QQ群突然炸了

然后我就又被重新拉进了初中同学微信群

是重新,重新,重新!!!

因为之前这个群太安静了

对于有强迫症的我来说是不能忍的

所以我就退了

昨天进去之后,发现大家早已是聊的火热了

看着那些陌生又熟悉的朋友

眼前尽是初中岁月的种种

大家一起斗鸡,八卦,疯闹

如今早已是渐行渐远

也只不过是8年的时光啊!!!


50- Pow(x, n)

实现 ref="https://www.cplusplus.com/reference/valarray/pow/">pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000

示例 2:

输入: 2.10000, 3
输出: 9.26100

示例 3:

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

说明:

  • -100.0 < x < 100.0
  • n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

思路:

这一题题目很容易看懂,但容易看懂的题目往往都不简单,这一题亦不例外。最直接的方法肯定是那个Pow()作弊函数嘛,但是直接写这个肯定是没有一点意义的(bug的是还能跑出个90%以上的效率,醉了醉了)其次直接的就是累计相乘嘛,这个肯定是大多数人最开始想到的,我把代码也贴了出来。

class Solution:
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        final_n = 1.0
        if n == 0:
            return 1
        elif n > 0:
            for index in range(n):
                final_n = final_n*x
                if final_n >= 2**31-1:
                    return 2**31-1
                if final_n <= -2**31:
                    return -2**31
        else:
            n = abs(n)
            for index in range(n):
                final_n = final_n*x
                if 1/final_n >= 2**31-1:
                    return 2**31-1
                if 1/final_n <= -2**31:
                    return -2**31
            final_n = 1/final_n
        return final_n


if __name__ == "__main__":
    x = 2.0
    n = -2
    result = Solution().myPow(x, n)
    print(result)

但是最直接最容易想到方法往往效率堪忧,这题更是如此,直接就是超出时间限制了。

那该怎么办呢?我接下来其实是想到了<<左乘方法,比如x<<n就是将x乘以n倍,但是这个方法的限制就是x必须是整数,浮点数那就是报错了,因为<<左乘其实是动用了二进制的思想,所以要求x必须是整数,对于此题只好作罢。无奈之下,只能是动用那个万能方法了——度娘,啊哈哈哈哈哈哈哈哈。偶然间看到了一位大佬的方法,思路真的是新奇啊,言语已无法表达我对他的钦佩之情,代码极其简单,主要就是动态规划的思想,一看就知。所以我也就不多说了,直接上代码。

class Solution:
    # 本题类似动态规划的思想,将幂次方问题分解为两数相乘问题,使之简便
    # 本来之前想到过<<左乘方法,但是该方法只能适用于整数类型
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        # 如果次方n小于0,则要将其调整为正数
        if n < 0:
            x = 1/x
            n = -n
        # 这个是出口条件,当n==0时,式子为1
        if n == 0:
            return 1
        elif n % 2 == 0:
            return self.myPow(x*x, n//2)
        else:
            return self.myPow(x*x, n//2)*x


if __name__ == "__main__":
    x = 2.0
    n = -2
    result = Solution().myPow(x, n)
    print(result)

执行效率真的是顶呱呱,在90%以上。

LeetCode50- Pow(x, n)

相关文章: