1. 程式人生 > 資訊 >亞馬遜前高管曝料:貝索斯認為懶惰是天性,監視倉庫員工一舉一動

亞馬遜前高管曝料:貝索斯認為懶惰是天性,監視倉庫員工一舉一動

描述

給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

保證base和exponent不同時為0。不得使用庫函式,同時不需要考慮大數問題,也不用考慮小數點後面0的位數。

實際上就是實現一個計算 a ^ b 的函式。

樸素演算法

讓 exponent 個 base 相乘,時間複雜度是 O(exponent)。

// c++
class Solution {
public:
    double Power(double base, int exponent) {
        double res = 1;
        if (exponent < 0) base = 1 / base, exponent = -exponent; // 注意指數為負,底數變成 1/base
        while (exponent--) 
            res *= base;
        return res;
    }
};
# python3
# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        res = 1
        if exponent < 0: base, exponent = 1/base, -exponent
        for _ in range(exponent):
            res *= base
        return res

快速冪

將 exponent 看成二進位制,例如:

  a ^ (0b1011)
= a ^ (0b1000 + 0b0000 + 0b0010 + 0b0001)
= a^(0b1000) * a^(0b0000) * a^(0b0010) * a^(0b0001)
= (1 * a^(2^3)) * (0 * a^(2^2)) * (1 * a^(2^1)) * (1 * a^(2^0))

可以看出規律,exponent 每一位是否為 1 決定了是否乘 base 的某次方,而 base 的某次方可以通過迴圈累乘得到,這樣就把演算法的時間複雜度降為了 O(log(exponent))。這個方法也叫快速冪。

// c++
class Solution {
public:
    double Power(double base, int exponent) {
        double res = 1;
        if (exponent < 0) base = 1 / base, exponent = -exponent;
        while (exponent) {
            if (exponent & 1) res *= base;
            base *= base;
            exponent >>= 1;
        }
        return res;
    }
};
# python3
# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        res = 1
        if exponent < 0: base, exponent = 1/base, -exponent
        while exponent:
            if exponent & 1: res *= base
            base, exponent = base ** 2, exponent // 2
        return res