瞪大眼睛 -- 剑指 Offer 16. 数值的整数次方

题目来源:剑指 Offer 16. 数值的整数次方


实现 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


方法一:失控的暴力循环,禁止!
# class Solution:
#     def myPow(self, x: float, n: int) -> float:
#         # 暴力循环 直接超出时间
#         res = 1
#         if n >= 0 :
#             for i in range(n):
#                 res *= x
#         else:  # 负数次幂的时候,转化为(1/x)的(-n)次幂
#             for i in range(-n):
#                 res *= 1/x
#         return res
方法二:偷懒取巧的运算符,别闹了!
class Solution:
    def myPow(self, x: float, n: int) -> float:
        #实际上对python来说,为啥不直接
        return x**n
方法三:一些正儿八经的方法----分析来源
  1. 首先考虑正负数的问题,可以把n<0的情况转化为n>0的范围内;
  2. 根据二分推导,可通过循环 x = x2 操作,每次把幂从 n 降至 n/2 ,直至将幂降为 0 ;
  3. 设 res=1 ,则初始状态 xn = xn * res, 在循环二分时,每当 n 为奇数时,将多出的一项 x 乘入 res ,则最终可化至 xn = x0 * res = res,返回 res 即可。
  4. 时间复杂度 O(log2 n) ; 空间复杂度 O(1)。
class Solution:
    def myPow(self, x: float, n: int) -> float:
        # 利用了一些二进制的思想
        if x == 0: 
            return 0
        res = 1
        if n < 0:     # 把问题转化至 n≥0 的范围内
            x, n = 1 / x, -n
        while n:
            if n%2 != 0: 
                res *= x
            x *= x
            n = n//2  #向下取整了
        return res

胡言乱语一句:不出意外的停更了两天😭,好吧,人总是突如其来的high,也突如其来的丧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值