剑指OFFER 15:数值的整数次方 代码的完整性

牛客

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。(不考虑大数问题)

一,代码的完整性

1.1 三个方面确保代码的完整性。

功能测试:即考虑普通功能测试的测试用例。比如上述例子中实现的代码可以完成求数值正整数次方的基本要求。
边界测试:考虑各种边界值的测试用例。如结束循环的边界条件是否正确,递归的终止条件是否正确,图遍历输入的是否为空指针等等。
负面测试:考虑各种错误的输入。即当出现错误输入时,程序应可以进行不同的错误处理。

1.2 三种错误的处理方式。

二,题目解法

2.1 算法描述

    

2.2 算法实现

bool invalidInput = false;   //全局变量用于表示是否出错
double Power(double base, int exponent)
{
    if (isEqual(base, 0.0) && exponent < 0)   //0的负数次方,没有意义
    {
        invalidInput = true;    //0不能求倒数,标记出错
        return 0.0;
    }

    //求指数的绝对值
    unsigned int absExponent = (unsigned int)(exponent);
    if (exponent < 0)
        absExponent = (unsigned int)(-exponent);

    //计算幂值
    double result = PowerWithUnsigenedExponent(base, absExponent);
    if (exponent < 0)
        result = 1.0 / result;
    return result;

}

bool isEqual(double num1, double num2)
{
    if ((num1 - num2>-0.0000001) && (num1 - num2<0.0000001))
        return true;
    else
        return false;
}

double PowerWithUnsigenedExponent(double base, unsigned int exponent)
{
    if (exponent == 0)
        return 1;
    if (exponent == 1)
        return base;

    double result = PowerWithUnsigenedExponent(base, exponent >> 1);
    result *= result;
    if (exponent & 0x1 == 1)
        result *= base;

    return result;
}

时间复杂度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;
        double  result=Power(base,n>>1);
        result*=result;
        if((n&1)==1)
            result*=base; 
        if(exponent<0)
            result=1/result;
        return result;             
  }
}

2.3 算法分析

注意:

1,为了确保代码的完整性,在第一个代码中使用了 invalidInput 全局变量来表示是否出错,在面试中写代码一定要注意代码的完整性,及三种错误的处理方式。(使用返回值,全局变量,异常机制)

2,控制误差:isEqual 函数中,由于浮点数在计算机中表示有误差,不能说base == 0 ,base 就一定是0 了,所以用base 与 0.0 相减,答案在一定范围内,就是0.

3,利用数学公式减少乘法次数。

4,位运算的应用:>> 表示除以2, & 运算判断奇偶性,

通过二进制判断奇偶性:二进制最后一位为0 则为偶数,否则为奇数,因为二进制除了最后一位都是2的幂,一定为偶数,最后一位为0 则该数为偶数,否则为奇数。

(&:同为1为1,否则为0)

5=101 , 1 = 001  ,5&1 = 001  ,5是奇数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值