剑指offer

面试题16. 数值的整数次方

2020-03-09  本文已影响0人  人一己千

题目

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

示例 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] 。
注意:本题与主站 50 题相同:https://leetcode-cn.com/problems/powx-n/

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法

需要考虑的点:

  1. x=0.0的情况;
  2. n为负数正数为0的情况;
  3. n数量级非常大,有可能超时。

思路:
最简单的办法就是先处理特殊值:x=0单独考虑,n为负数则结果倒数一下,用循环有多少x乘n次。
但是当n数值非常大的时候就很容易超时了,所以需要借助以下公式:

a^n= \begin{cases} a^{n \over 2 } *a^{n \over 2} \quad n为偶数 \\ a^{n \over 2}*a^{n \over 2}*a \quad n为奇数 \end{cases}

转化成递归形式:
f(n) = \begin{cases} f(n/2)*f(n/2) \quad n是偶数 \\ f(n/2)*f(n/2)*n \quad n是奇数 \end{cases}

class Solution:
    def myPow(self, x: float, n: int) -> float:
        if x == 0 : return 0       # x等于0作为特殊情况处理,实际上并不等于0
        if n == 0 : return 1    # 循环结束的条件
        if n < 0 : 
            n = -n 
            x = 1/x
        result = self.myPow(x, n>>1)        # 通过右移作为除2
        result *= result
        if n&1 ==1:                         # 通过和1做与运算 判断奇偶数
            result *= x
        return result 

总结

递归思想。

上一篇下一篇

猜你喜欢

热点阅读