数值的整数次方

剑指offer-牛客网

Posted by Y. on October 31, 2018

数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 时间限制:3秒 空间限制:32768K

思路

先判断指数的区间,在依据底来判断

代码

function Power(base, exponent)
{
    // write code here
    if(exponent > 0) {
        let result = 1;
        while(exponent > 0) {
            result *= base;
            exponent--;
        }
        return result;
    } else if(exponent == 0) {
        if(base > 0) {
            return 1;
        } else {
            return false;
        }
    } else {
        if(base == 0) {
            return 1;
        } else {
            let result = 1;
            let numbrer = Math.abs(exponent);
            
            while(numbrer > 0) {
                result *= base;
                numbrer--;
            }
            return 1 / result;
        }
    }
}

运行时间:14ms
占用内存: 5340k

简化版代码

考虑到以上代码有逻辑重合部分,因此给出简化代码;单独列出返回false的情况,其他情况下依据指数的正负,返回分数或整数;

function Power(base, exponent)
{
    // write code here
    var result = 1;
    for(var i = 0; i < Math.abs(exponent); i++) {
        result *= base;
    }
    
    if(base == 0 && exponent <= 0) {
        return false;
    } else if(exponent < 0) {
        return 1 / result; 
    } else {
        return result;
    }
}

时间复杂度仍为O(n)

最佳代码

参考:

  • 二分幂
function Power(base, exponent)
{
    // write code here
    function fnc(base, exponent) {
        if(exponent == 0) {
            return 1;
        } else if(exponent == 1) {
            return base;
        } else {
           var result = fnc(base, Math.floor(exponent / 2));
           result *= result;
           if(exponent & 1) {                
               return result * base;
           } else {
               return result;
           } 
        }
    }
        
    if(base == 0 && exponent <= 0) {
        return false;
    }
    
    var result = fnc(base, Math.abs(exponent));
    return exponent > 0 ? result : (1 / result);
}
  • 简单快速幂
function Power(base, exponent)
{
    // write code here
    if(base == 0 && exponent <= 0) {
        return false;
    }
    
    var absOfExponent = Math.abs(exponent);
    var current = base;
    var result = 1;
    while(absOfExponent > 0) {
        if(absOfExponent & 1) {
            result *= base;
        }
        base *= base;
        absOfExponent >>= 1;
    }
    return exponent > 0 ? result : (1 / result);
}