昨天,不知为何,初中同学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%以上。