《劍指 Offer (第 2 版)》第 16 題:數(shù)值的整數(shù)次方(快速冪)

第 16 題:數(shù)值的整數(shù)次方(快速冪)

傳送門:AcWing:數(shù)值的整數(shù)次方闰靴,牛客網(wǎng) online judge 地址卦溢。

實現(xiàn)函數(shù)double Power(double base, int exponent)改艇,求baseexponent次方。

不得使用庫函數(shù)故痊,同時不需要考慮大數(shù)問題。

注意:

  • 不會出現(xiàn)底數(shù)和指數(shù)同為 0 的情況

樣例1:

輸入:10 玖姑,2

輸出:100

樣例2:

輸入:10 愕秫,-2

輸出:0.01

分析:數(shù)值的整數(shù)次方,要處理一些細節(jié)問題焰络,加法變成乘法戴甩。考慮底數(shù)為 0 的時候闪彼,指數(shù)不能為負數(shù)甜孤。

思路1:使用遞歸

Python 代碼:

class Solution(object):
    def Power(self, base, exponent):
        """
        :type base: float
        :type exponent: int
        :rtype: float
        """

        if exponent == 0:
            return 1

        if exponent < 0:
            return 1 / self.Power(base, -exponent)

        # 如果是奇數(shù)
        if exponent & 1:
            return base * self.Power(base, exponent - 1)
        return self.Power(base * base, exponent >> 1)

思路2:非遞歸的寫法,把 exponent 想象成二進制畏腕。

Python 代碼:在理解的基礎(chǔ)上記住這個寫法

class Solution(object):
    def Power(self, base, exponent):
        """
        :type base: float
        :type exponent: int
        :rtype: float
        """

        if exponent < 0:
            base = 1 / base
            # 負數(shù)變成正數(shù)
            exponent = -exponent

        res = 1
        while exponent:
            if exponent & 1:
                res *= base
            base *= base
            exponent >>= 1
        return res

給定一個 double 類型的浮點數(shù) base 和 int 類型的整數(shù) exponent 缴川。求 base 的 exponent 次方。

求解思路與關(guān)鍵

  • 注意分類討論與與遞歸函數(shù)的設(shè)計描馅。

  • 關(guān)鍵:將循環(huán)變成遞歸操作把夸,每次折半求值,避免死板做循環(huán)铭污,這種感覺像加法變乘法恋日。

  • 注意細節(jié):底數(shù)為 0 的時候,指數(shù)為負數(shù)是沒有意義的

  • 精確計算况凉,轉(zhuǎn)成浮點數(shù) 0.125:

System.out.println((double) 1 / 8);
  • 右移 1 位運算等價于“除以 2”:
// exponent 指數(shù)谚鄙,exponent >> 1 表示將指數(shù)除以 2
System.out.println(exponent >> 1);
  • 使用位運算的 與 運算符代替了求余數(shù)運算,來判斷一個數(shù)是奇數(shù)還是偶數(shù):
if ((exponent & 1) == 0) {

Java 代碼:

public class Solution {

    public double Power(double base, int exponent) {
        // 先把極端情況考慮到
        // 不能用 == 比較兩個浮點數(shù)是否相等刁绒,因為有誤差
        if (equals(base, 0) && exponent < 0) {
            throw new IllegalArgumentException("當?shù)讛?shù)為 0 的時候闷营,指數(shù)為負數(shù)沒有意義");
        }
        if (exponent == 0) {
            return 1.0;
        }
        // 下面將指數(shù)的兩種情況合并成一種情況考慮
        if (exponent > 0) {
            return power(base, exponent);
        } else {
            return power(1 / base, -exponent);
        }
    }

    public double power(double base, int exponent) {
        if (exponent == 0) {
            return 1.0;
        }
        if (exponent % 2 == 0) {
            double square = power(base, exponent / 2);
            return square * square;
        } else {
            double square = power(base, (exponent - 1) / 2);
            return square * square * base;
        }
    }

    private boolean equals(double num1, double num2) {
        return num1 - num2 < 0.000001 && num1 - num2 > -0.000001;
    }
}

Java 代碼:

public class Solution {

    public double Power(double base, int exponent) {
        if (exponent == 0) {
            return 1;
        }
        if (exponent < 0) {
            return 1 / Power(base, -exponent);
        }
        // 使用位運算的 與 運算符代替了求余數(shù)運算,來判斷一個數(shù)是奇數(shù)還是偶數(shù)
        if ((exponent & 1) == 0) {
            double square = Power(base, exponent >> 1);
            return square * square;
        } else {
            double square = Power(base, (exponent - 1) >> 1);
            return square * square * base;
        }
    }

    public static void main(String[] args) {
        int base = 3;
        int exponent = -3;
        Solution solution = new Solution();
        double result1 = solution.Power(base, exponent);
        System.out.println(result1);
        exponent = 6;
        double result2 = solution.Power(base, exponent);
        System.out.println(result2);
        // exponent 指數(shù),exponent >> 1 表示將指數(shù)除以 2
        System.out.println(exponent >> 1);
    }
}

LeetCode 第 50 題:Pow(x, n)

傳送門:50. Pow(x, n)傻盟。

實現(xiàn) pow(x, n) 速蕊,即計算 x 的 n 次冪函數(shù)。

示例 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 位有符號整數(shù)娘赴,其數(shù)值范圍是 [?231, 231 ? 1] 规哲。

思路1:使用循環(huán),把指數(shù) n 想成二進制

Python 代碼:

class Solution:
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        
        
        if n < 0:
            x = 1 / x
            n = - n
        res = 1
        while n:
            if n & 1 == 1:
                res *= x
            # 注意:這里不要寫成  res *= res
            x *= x 
            n >>= 1
        return res

思路2:將循環(huán)變成遞歸操作诽表,每次折半求值唉锌,避免死板做循環(huán),這種感覺像加法變乘法竿奏。(腦子里回憶公式)袄简。注意細節(jié):底數(shù)為 0 的時候,指數(shù)為負數(shù)是沒有意義的泛啸。

Python 代碼:遞歸寫法:注意邊界條件

class Solution:
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        # 對 x = 0 绿语, n < 0 還要做特判
        if n == 0:
            return 1
        if n < 0:
            return 1 / self.myPow(x, -n)

        if n & 1:
            return x * self.myPow(x, n - 1)
        return self.myPow(x * x, n // 2)

基本的寫法:

https://blog.csdn.net/happyaaaaaaaaaaa/article/details/76552127

《劍指 Offer (第 2 版)》第 16 題:數(shù)值的整數(shù)次方(快速冪)-1

模板寫法1:

《劍指 Offer (第 2 版)》第 16 題:數(shù)值的整數(shù)次方(快速冪)-2

模板寫法2:

《劍指 Offer (第 2 版)》第 16 題:數(shù)值的整數(shù)次方(快速冪)-3
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市候址,隨后出現(xiàn)的幾起案子吕粹,更是在濱河造成了極大的恐慌,老刑警劉巖岗仑,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匹耕,死亡現(xiàn)場離奇詭異,居然都是意外死亡荠雕,警方通過查閱死者的電腦和手機泌神,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舞虱,“玉大人,你說我怎么就攤上這事母市》担” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵患久,是天一觀的道長椅寺。 經(jīng)常有香客問我,道長蒋失,這世上最難降的妖魔是什么返帕? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮篙挽,結(jié)果婚禮上荆萤,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好链韭,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布偏竟。 她就那樣靜靜地躺著,像睡著了一般敞峭。 火紅的嫁衣襯著肌膚如雪踊谋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天旋讹,我揣著相機與錄音殖蚕,去河邊找鬼。 笑死沉迹,一個胖子當著我的面吹牛睦疫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胚股,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼笼痛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琅拌?” 一聲冷哼從身側(cè)響起缨伊,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎进宝,沒想到半個月后刻坊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡党晋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年谭胚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片未玻。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡灾而,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扳剿,到底是詐尸還是另有隱情旁趟,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布庇绽,位于F島的核電站锡搜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞧掺。R本人自食惡果不足惜耕餐,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辟狈。 院中可真熱鬧肠缔,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亚隅,卻和暖如春硼莽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煮纵。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工懂鸵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人行疏。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓匆光,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酿联。 傳聞我的和親對象是個殘疾皇子终息,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容