|
发表于 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 |
|