剑指offer(十二)数值的整数次方

来源:互联网 发布:js是什么文件格式 编辑:程序博客网 时间:2024/06/03 14:47
  • 题目

    • 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
  • 案例

    • 2.5的3次方,3.6的5次方,2.8的-3次方等等
  • 分析

    • 第一想法就是return Math.pow(base, exponent);然后通过了,这也是一个方法,java内部封装好的工具类
    • 但是题目显然不是为了让我们那么随便过去的,而是要达到锻炼的目的
    • 一种就是直接循环,先将exponent取绝对值,然后一次次让base相乘,最后判断exponent的正负来决定是否取相反数
    • 另一种就是递归调用,利用二进制来计算
  • 解题代码:循环相乘

// 传统公式求解时间复杂度O(n)public class Solution {    public double Power(double base, int exponent) {        double  result = 1;        for(int i = 0; i < Math.abs(exponent); i++)        {            result *= base;        }        if(exponent < 0)        {            result = 1 / result;        }        return result;              }}
  • 解题代码:递归调用
// 递归:n为偶数,a^n=a^n/2*a^n/2;n为奇数,a^n=(a^(n-1)/2)*(a^(n-1/2))*a// 时间复杂度O(logn) public class Solution {    public double Power(double base, int exponent) {        // 取绝对值        int n = Math.abs(exponent);        // 特殊情况直接返回        if(n == 0) return 1;        if(n == 1) return base;        // 递归调用,>>1的话,偶数相当于直接除以2,奇数相当于减一之后除以2        double result = Power(base, n >> 1);        result *= result;        // 如果是&1等于1的话,代表是奇数,则需要再乘一次        if((n & 1) == 1)            result *= base;        // 如果小于0,则需要取相反数        if(exponent < 0)            result = 1 / result;        return result;              }}
  • 总结
    • 题目比较简单,前面两种都容易理解,递归需要仔细思考一下,还是利用到了二进制的性质来解答
原创粉丝点击