前言:
之前刷《剑指OFFER》试图几天看完,当时心想一共即使道题,一天看个十道八道,一星期不就看完了。对于基础本身就很扎实的同学来说肯定是这样的。可是我也不是科班出身,基础一点也不扎实,粗略看完一遍其实并没有读透。之后又看了一阵子数据结构,看了一阵子《算法竞赛入门》,结合这博客论坛看了一阵子编程题。现在再回来重新精读一遍《剑指OFFER》,想必将有新的收获。
增强代码的鲁棒性需要我们考虑很多因素:
- 非法的输入:例如返回链表的倒数第k个元素,但是链表本身没有k个元素。
- 特殊的输入:例如输入的链表为空指针。
- 运算过程中会不会溢出。
- 等等……
例1(《剑指OFFER》第16题):
求输入数字的整数次方,即实现以下函数(不考虑大数问题,如果没有说不考虑大数问题要问面试官):
double Power(double base,int e){
}
首先应该考虑的边界条件是,如果e是0和负数该怎么办,如果底数base是0或者负数怎么办。
base\e | 正 | 0 | 负 |
---|---|---|---|
正 | 正常求解 | 1 | 先求正数次幂,再求倒数 |
0 | 0 | 1 | 无意义 |
负 | 正常求解 | 1 | 先求正数次幂,再求倒数 |
其次应该考虑的是,如何降低计算的复杂度。比起做e-1次乘法,还有更高效的O(logn)的方法:
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
if (exponent == 0)
return 1;
if (exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base, exponent >> 1);
result *= result;
if ((exponent & 0x1) == 1)
result *= base;
return result;
}
最后要注意,浮点数因为精度问题是不能直接判断相等的,要自己设置精度,编写equal函数:
bool equal(double num1, double num2)
{
if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
return true;
else
return false;
}