前言
在面试编程的时候,代码的规范性和完整性非常重要,可能成为能否拿到 offer 的关键因素。那么代码的规范性如何体现呢?比如清晰的书写、代码布局清晰(如缩进,括号对齐)、变量和函数的命名易懂。而代码的完整性体现在代码基本功能实现的正确性以及在边界值、错误处理等方面的全面考虑。
那么完整的代码需要从功能测试、边界测试以及负面测试来提高鲁棒性。例如,在功能测试中,除了完成基本功能,还需要考虑数值的表示范围;在边界测试中,需要考虑循环条件和递归终止条件的正确性;在负面测试中,需要考虑边界值和特殊值的输入,以解决一些不合法的情况。
那么对于错误处理的方式主要有三种,分别是函数用返回值来告知API调用者是否出错,如返回 0 表示出错;当错误发生时设置一个全局变量来记录;对错误情况,采用抛异常的处理方式。
题目(数值的整数次方)
题目:实现函数 double Power(double base,int exponent),求 base 的 exponent 次方。不得使用库函数,同时不需要考虑大数范围。
算法思路
首先我们应该对输入参数的各种情况进行讨论。
- 如果基 base 是 0 而且 指数 exponent 是负数,那么情况判为不合法输入;
- 注意基 base 是 0 而且 指数 exponent 也是 0 ,这种情况在数学上是无意义的。
- 无论指数 exponent 是正还是负都统一先转成无符号的整形类型,方便统一计算整数次方。然后,对于 exponent 为负的情况,只需将结果变为倒数即可。
优化多次乘方的思路:
如果输入的指数 exponent 为 32,那么需要进行 31 次乘法操作。那么,如果我们能先算出数字的 16 次方,然后再平方一次即可;那么假如知道了数字的 16 次方,那么只需要在数字的 16 次方的基础上平方一次即可得到结果,那如果知道了数字的 8 次方,那么就可以在数字的 8 次方基础上平方一次得到数字的 16 次方的结果;那么如果知道数字的 4 次方,就可以在数字 4 此方的基础上平方一次得到数字的 8 次方;一次类推,直到知道了数字的 1 次方。
那么可用如下公式表示 a 的 n 次方:
算法实现
剑指offer版
个人写法
复杂度分析
时间主要消耗在求解乘法运算结果上面,而使用递归方法(二分原问题)进行乘法求解的时间复杂度为 O(logn),空间复杂度为 O(1)。
参考
<<剑指offer2>>