【面试技巧】代码的鲁棒性

前言:

之前刷《剑指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;
}

你可能感兴趣的:(【面试技巧】代码的鲁棒性)