| 
 | 
 
 
发表于 2020-5-11 23:08:10
|
显示全部楼层
 
 
 
1.暴力求解,肯定超时,但是可以根据暴力求解优化 
- def myPow_0(x: float, n: int)-> float:
 
 -     ans = 1.0
 
 -     if n == 0:
 
 -         return ans
 
 -     for i in range(1, abs(n) + 1):
 
 -         ans *= x
 
 -     return ans if n > 0 else 1.0 / ans  # 处理n为负数的方法
 
  复制代码 
2.进行优化,不要乘n次,而是每次乘平方,对n的基偶进行判断,奇数要额外乘一个x(用递归特别容易理解) 
- def myPow_1(x: float, n: int)-> float:
 
 -     def helper(N: int):
 
 -         if N == 0:
 
 -             return 1.0
 
 -         y = helper(N // 2)
 
 -         return y * y * x if N % 2 else y * y
 
  
-     return helper(n) if n >= 0 else 1.0 / helper(-n)
 
  复制代码 
3.想到一个以前做过的题,用1,2,4,8,16,32,64,128的加法组合表示1-255的数(二进制) 
和这题比较像,转化为n用这些数表示,然后幂相加就是数相乘 
- def myPow_2(x: float, n: int) -> float:
 
 -     if n == 0:
 
 -         return 1.0
 
 -     N, ans = abs(n), 1.0
 
 -     x_order = ans * x
 
 -     while N:
 
 -         if N % 2:
 
 -             ans *= x_order
 
 -         x_order *= x_order
 
 -         N //= 2
 
 -     return ans if n > 0 else 1.0 / ans
 
  复制代码 
4.理解了之后,就可以用位运算符中的右移运算符 
- def myPow_3(x: float, n: int) -> float:
 
 -     N, ans = abs(n), 1.0
 
 -     while N:
 
 -         if N & 1:
 
 -             ans *= x
 
 -         x *= x
 
 -         N >>= 1
 
 -     return ans if n >= 0 else 1.0 / ans
 
  复制代码 
 
我还是最喜欢3  |   
 
 
 
 |