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

前言:

之前刷《剑指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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容