剑指 Offer 16. 数值的整数次方
本文最后更新于 1599 天前,其中的信息可能已经有所发展或是发生改变。

1. 要点

这道题一看就是考优化,尝试了很多次才过了,要点的话,就是用数组存结果时(打表),创建的数组太大,空间要求过不了,并且没有充分利用这个数组,很多元素都是空的.想了想这个数组的使用场景,用下标获取结果,那不就是Map嘛,要多大,就用多大,这下就不会浪费空间了

2. 题目

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

3. 示例 1:

输入: 2.00000, 10
输出: 1024.00000

4. 示例 2:

输入: 2.10000, 3
输出: 9.26100

5. 示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
 

5. 说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

6. 代码

    private int[] arrTwo;
    private Map<Integer,Double> arrRes=new HashMap<>();

    public double myPow(double x, int n) {
        if(n==0){
            return 1;
        }
        arrTwo=new int[32];
        arrTwo[0]=1;
        arrTwo[1]=2;
        for (int i = 2; i < 32; i++) {
            arrTwo[i]=arrTwo[i-1]*2;
        }
        if (n<0){
            x=1/x;
            n=-n;
        }
        int i=2;
        arrRes.put(1,x);
        return func(x,n);
    }

    public double func(double x,int n){
        if (arrRes.containsKey(n)){
            return arrRes.get(n);
        }
        double res=x;
        int i=2;
        for ( ; n-arrTwo[i-1]>=0; i++) {
            res*=res;
            arrRes.put(arrTwo[i-1],res);
            if(n==arrTwo[i-1]){
                return res;
            }
        }
        res*=func(x,n-arrTwo[i-2]);
        return res;
    }
作者:Yuyy
博客:https://yuyy.info

评论

  1. 老李
    Windows Edge
    4年前
    2020-11-28 13:34:19

    老余这算法还是很牛的嘛

    • admin
      博主
      老李
      Linux Chrome
      4年前
      2020-11-28 19:58:10

      基操

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇