剑指offer--12. 数值的整数次方

题目:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

思路:
Math.pow(base, exponent) ? (面试官的微笑)

考虑

  1. base为0,exponent<0,无效的输入
  2. 指数为正
  3. 指数为负
  4. 指数为0
    四种情况即可
  • 朴素算法
    就是把a连乘b次,时间复杂度为O(n)
  • 快速幂算法
    时间复杂度为O(logn),原理如下:

假设我们要求a ^ b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2 ^ (i-1),例如当b==11时,a ^ 11 = a ^ (2 ^ 0+2 ^ 1 + 2 ^3 )
  11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a^1 * a ^ 2 * a ^ 8,看出来快的多了吧原来算11次,现在算三次。
由于是二进制,很自然地想到用位运算这个强大的工具:&和>>
&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x & 1==0为偶,x & 1==1为奇。 >>运算比较单纯,二进制去掉最后一位

public class Solution {
    public double Power(double base, int exponent) {
        double ans = 1;
        int n = exponent;
        if(exponent < 0){
            if(base == 0)
                throw new RuntimeException("分母不能为0");
            n = -exponent;
        }
        if(exponent == 0)
            return 1;
        while(n != 0){
            if((n & 1) == 1)
                ans *= base;
            base *= base;
            n >>= 1;
        }
        return exponent > 0 ? ans : (1 / ans);
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,199评论 0 13
  • __ __ |__| _____ __ __ ┌...
    wangchuang2017阅读 6,813评论 2 1
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,058评论 0 13
  • 城市上空的雨 是我想念你的泪 溅起了涟漪 画满春日的街景 城市上空的雨 是你写给我的歌 干涸的钢筋 听到了绕指的柔...
    清涟夭夭阅读 153评论 0 0
  • 昨天,同学聚会。 远在异地,在群里看着那些似曾熟悉的和不熟悉的面孔,努力回忆曾经的点滴。喜欢着他们的喜欢。 明天,...
    棒棒他娘阅读 98评论 0 0