【Golang】LeetCode-剑指Offer-面试题16-数值的整数次方【两种解法】

题目

实现函数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] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof


解题思路

  • 快速幂

    • 快速幂可以用位运算来实现

      • n & 1 — 取n的二进制数最低位 , n & 1 =1 ,n为奇数,=0 为偶数 ,相当于 n % 2==0

      • n >> 1 —右移1位, 去掉 n 的二进制数最低位 , 相当于 n / 2

      • 当 n 为偶数时

        • x ^ n = x ^( n / 2 ) * x ^( n / 2 )
        • n >> 1 , n右移 1 位后,x 扩大为它的平方,因为二进制每位的差距是平方关系
      • 当 n 为奇数时

        • 需要再乘以多出来的一次,即 x ^ n = x * x ^( n - 1 )
        • n - 1 , x 不更新,将 x 累乘到 ret

解法一:递归

–执行用时:0 ms --内存消耗:2 MB

func myPow(x float64, n int) float64 {
    if n == 0{
        return 1
    }
    if n == 1{
        return x
    }
    if n<0{
        x = 1/x
        n = -n
    }
    temp := myPow(x , n/2)
    if n%2 == 0{
        return temp*temp
    }
    return x*temp*temp
}

解法二:迭代

–执行用时:0 ms --内存消耗:2 MB

func myPow(x float64, n int) float64 {
    if n == 0{
        return 1
    }
    if n == 1{
        return x
    }
    if n<0{
        x = 1/x
        n = -n
    }
    ret:=1.0
    for n>=1{
        if n & 1 == 1{
            ret *= x
            n--
        }else{
            x *= x
            n = n >> 1
        }
    }
    return ret
}

你可能感兴趣的:(LeetCode力扣个人题解)