<h2 id="1">1. 代码质量</h2>
<h3 id="1.1">1.1 代码的规范性</h3>
清晰的书写
清晰的布局
合理的命名
<h3 id="1.2">1.2 代码的完整性</h3>
功能测试
边界测试
负面测试
<h4> 面试题16、数值的整数次方</h4>
初始解法:
double Power(double base, int exponent){
double result = 1.0;
for(int i = 1; i <= exponent; i++){
result *= base;
}
return result;
}
以上代码考虑的并不完整,未考虑输入指数(exponent)小于1的情况。
全面但不高效的解法
分析:当指数为负数时,可以先对指数取绝对值,算出结果后再取倒数。还需要考虑底数为0,指数为负数的情况,针对这种错误,有3种处理办法:返回值、全局变量和异常。
bool g_InvalidInput = false;
double Power(double base, int exponent){
g_InvalidInput = false;
if(equal(base, 0.0) && exponent < 0){
g_InvalidInput = true;
return 0.0;
}
unsigned int absExponent = (unsigned int)exponent;
if(exponent < 0){
absExponent = (unsigned int)(-exponent);
}
double result = PowerWithUnsignedExponent(base, absExponent);
if(exponent < 0){
result = 1.0/result;
}
return result;
}
double PowerWithUnsignedExponent(double base, unsigned int exponent){
double result = 1.0;
for(int i = 0; i <= exponent; i++){
result *= base;
}
return result;
}
上述代码采用全局变量来标识是否出错。但是代码需要调用者去检查全局变量以判断是否出错。
全面又高效的解法
分析:对次方进行拆解,使用递归实现
公式:
a^n=\left\{
\begin{aligned}
a^{n/2}*a^{n/2} \text{, n为偶数}\\
a^{(n-1)/2}*a^{(n-1)/2} \text{, n为奇数}
\end{aligned}
\right.
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;
}
}
细节
用右移运算替代除以2,用位运算符替代求余来判断奇数偶数。提高了执行效率。
<h3 id="1.3">1.3 代码的鲁棒性</h3>
<h2 id="2">2. 结语</h2>
<h2 id="3">3. 参考文献</h2>
剑指offer