【剑指offer】JZ16 数值的整数次方

1 问题

实现函数 double Power(double base, int exponent),求base的exponent次方。

注意:
1.保证base和exponent不同时为0。
2.不得使用库函数,同时不需要考虑大数问题
3.有特殊判题,不用考虑小数点后面0的位数。

数据范围: ∣ \mid base ∣ ≤ 100 |\leq 100 100, ∣ e x p o n e n t ∣ ≤ 100 | exponent \mid \leq 100 exponent∣≤100 ,保证最终结果一定满足 ∣ v a l ∣ ≤ 1 0 4 |v a l| \leq 10^4 val104
进阶:空间复杂度 O(1) ,时间复杂度 O(n)

示例1
输入:2.00000,3
返回值:8.00000

示例2
输入:2.10000,3
返回值:9.26100

示例3
输入:2.00000,-2
返回值:0.25000
说明:2的-2次方等于1/4=0.25

2 答案

自己写的,比较傻瓜

class Solution:
    def Power(self , base: float, exponent: int) -> float:
        if exponent == 0:
            return 1
        is_zheng = True
        res = 1
        if exponent < 0:
            is_zheng = False
        for _ in range(abs(exponent)):
            res *= base
        return res if is_zheng else 1/res

官方解

  1. 直接运算
  • step 1:先处理次方数为负数的情况,将底数化为分数解决。
  • step 2:遍历次方数的次数,不断累乘底数。
class Solution:
    def Power(self , base: float, exponent: int) -> float:
        #处理负数次方
        if exponent < 0:
            base = 1 / base
            exponent = -exponent
        res = 1.0
        #累乘
        for i in range(exponent):
            res *= base
        return res
  1. 快速幂

分治:即“分而治之”,“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题,子问题继续按照这样划分,直到问题可以被轻易解决;“治”指的是将子问题单独进行处理。经过分治后的子问题,需要将解进行合并才能得到原问题的解,因此整个分治过程经常用递归来实现。
在这里插入图片描述

  • step 1:先处理次方数为负数的情况,将底数化为分数解决。
  • step 2:使用快速幂计算次方:将已乘出来的部分求次方,可以每次缩小一半要求的次方数。
class Solution:
    # 快速幂
    def Pow(self, x: float, y: int) -> float:
        res = 1
        while y:
            if y & 1:
                res *= x
            x *= x
            y >>= 1
        return res

    def Power(self, base: float, exponent: int) -> float:
        # 处理负数次方
        if exponent < 0:
            exponent = -exponent
            base = 1/base
        return self.Pow(base, exponent)

https://www.nowcoder.com/share/jump/9318638301698414504035

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LouHerGetUp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值