九度1514数值的整数次方

前奏

在写这个问题时,先说一下对于我们写程序时,应该考虑的问题。

代码的规范程度
      代码的书写规范程度会影响面试考官阅读代码的兴致,从下图可看出,书写、布局和命名规则都决定着代码的规范性。
      首先,规范的代码书写清晰。绝大部分面试都要求应聘者在白纸或者白板上书写。不要因为担心没时间写代码就在纸上写潦草或者简略。通常面试代码量不会超过50行,所以关键是在写代码前形成一个清晰的思路,并能把它用某种语言清楚的写出来。
      其次,规范的书写布局。由于我们平时用的是各种编程软件如VS。它里面已经加入合理的缩进和括号对齐等使代码清晰的功能。但在面试时,可能是文本编写,这时候就得格外注意布局问题。当循环、判断较多,逻辑复杂时,缩进的层次可能会较多,就更得注意,给面试官留下一个好印象。
      最后,规范的代码命名合理。应尽量避免简单变量命名,如i,j,k等。建议我们写代码时,用完整的英文单词组合命名变量和函数。比如函数需要传入一个二叉树的根结点作为参数,则可命名为:BinaryTreeNode* 。pRoot,
 
代码的完整性
 
功能测试
边界测试
负面测试3个方面设计测试用例
 

 

错误处理
      三种错误处理方法的比较
 
       重点论述一下第三种方法:当函数运行出错,我们可以抛出一个异常,根据不同的出错原因定义不同的异常类型。方便函数调用者根据异常类型就能知道出错原因。另外,利用try和cache模块来显示划分程序正常运行的代码块使代码逻辑较清晰。

 

正题

题目:实现函数 double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题。

分析:题目简单,但是面试时,能写完整并且让考官满意的人寥寥无几啊。

方法1:

         正常人都会想到的方法。

  1. double Power(double base, int exponent)  
  2. {  
  3.     double result = 1.0;  
  4.     for ( int i = 1; i <= exponent; i++ )  
  5.     {  
  6.         result *= base;  
  7.     }  
  8.     return result;  
  9. }  
如果你很快写出这样的代码,那你肯定被刷。

首先:边界情况处理。指数是负数时该如何处理。

其次:这样做效率较低,要循环指数次。

上述两点,估计你当时没有想过为什么会出这么简单的面试题。

方法2:

          考虑了边界情况,且有异常处理,较完整。

  1. bool g_InvalidInput = false;  
  2.   
  3. bool IsEqual(double num1, double num2)  
  4. {  
  5.     if ( (num1 - num2 > -0.000001)   
  6.         && (num1 - num2 < 0.000001))  
  7.     {  
  8.         return true;  
  9.     }  
  10.     else  
  11.         return false;  
  12. }  
  13.   
  14. double PowerWithUnsignedExponent(double base, unsigned int exponent)  
  15. {  
  16.     double result = 1.0;  
  17.     for (int i = 0; i < exponent; i++ )  
  18.     {  
  19.         result *= base;  
  20.     }  
  21.     return result;  
  22. }  
  23.   
  24. double Power(double base, int exponent)  
  25. {  
  26.     g_InvalidInput = false;  
  27.   
  28.     if ( IsEqual(base,0.0) && exponent < 0 )  
  29.     {  
  30.         g_InvalidInput = true;  
  31.         return 0.0;  
  32.     }  
  33.   
  34.     unsigned int absExponent = (unsigned int)(exponent);  
  35.     if ( exponent < 0 )  
  36.     {  
  37.         absExponent = (unsigned int)(-exponent);  
  38.     }  
  39.   
  40.     double result = PowerWithUnsignedExponent(base, absExponent);  
  41.     if ( exponent < 0)  
  42.     {  
  43.         result = 1.0/result;  
  44.     }  
  45.   
  46.     return result;  
  47. }  

方法3:

       对方法2中的PowerWithUnsignedExponent()函数进行了优化-位运算,能使考官眼前一亮。

  1. double PowerWithUnsignedExponent(double base, unsigned int exponent)  
  2. {  
  3.     if ( exponent == 0 )  
  4.         return 1;  
  5.   
  6.     if ( exponent == 1 )  
  7.         return base;  
  8.   
  9.     double result = PowerWithUnsignedExponent(base, exponent>>1);  
  10.     result *= result;  
  11.     if ( exponent & 0x01 == 1 )  
  12.         result *= base;  
  13.   
  14.     return result;  
  15. }  

总结:

平时想问题,多想想,尽量能够全面

细节决定成败,很关键。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值