给定一个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是奇数。