《剑指offer》笔记-第3章(1)

来源:互联网 发布:淘宝卖家如何改支付宝 编辑:程序博客网 时间:2024/05/16 08:28

第3章 高质量的代码

3.1面试官谈代码质量

       代码的容错处理能力

       正确的功能,考虑边界情况

       变量、函数命名有章法

       用合适的数据结构

       程序的正确性和鲁棒性

       输入参数的检查

       处理错误和异常

3.2代码的规范性

       应聘要求手写代码时,要字迹清晰、布局清晰、命名合理

       在写代码时,最好用完整的英文单词组合命名变量和函数,以便面试官能一眼读懂

3.2代码的完整性

       完整性的代码:完成基本功能、输入边界值能得到正确输出、对各种非法输入做出合理错误处理(即功能测试、边界测试、负面测试)

       考虑功能测试:尽量突破常规思维,看到更多的需求

       考虑边界测试:循环的边界条件是否正确;递归的终止条件是否正确

       能把将来需求可能的变化考虑进去,在需求发生变化时尽量减少代码改动的风险

       3种错误处理方法:

        1.    返回值:函数用返回值告知调用者是否出错;优点是和系统API一致;缺点是不能方便地使用

        2.    全局变量:当错误发生时设置一个全局变量;优点是能方便地使用结果;确定啊是用户可能会忘记检查全局变量

        3.    异常:当函数运行错误时抛出一个异常;优点是可以为不同的出错原因定义不同的异常类型,逻辑清晰;缺点是有些语言不支持异常,抛出异常时对性能有负面影响

面试题16:数值的整数次方

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

测试用例:

        底数和指数分别设为整数、负数、0   

分析:

       1.    当指数是负数时:先求指数的绝对值,计算出次方结果,求倒数;

       2.    当指数是负数底数是0:求倒数会出错,此时要采用错误处理;

       3.    0的0次方可以是0,可以是1,这要和面试官说清楚,表明已经考虑到边界;

       4.    求绝对值的方法:循环指数次乘法;

       5.    求绝对值更快的方法:指数是32(2^5),用5次,可以用递归实现;

       6.    使代码效率更高:用右移运算符代替除以2(exponent>>2);用位运算符代替求余运算来判断是奇数还是偶数(exponent & 0x1 == 1);

面试题17:打印从1到最大的n位数

       输入数字n,按照顺序打印出从1到最大的n位十进制数。如输入3,打印1,2……一直到999

测试用例:

        功能测试:输入1,2,3……

        特殊输入:-1,0

分析:

       1.    考虑到n没有范围,如果n很大,输出的数字超过int、long的限制;

       2.    在字符串上模拟数字的加法:

                  数字最大是n位,字符串要设置为n+1位,最后以为是结束字符\0;

                  当数字不够n位时,前面用0填充;

                  初始化字符串中每个字符为0;

                  思考如何进位;思考如何判断何时到达最大的n位数“99……9”;

                  打印从第一个非零字符开始;

                 不同的方法时间效率相差很大;

        3.    转化成数字排列的问题,递归使代码简洁:

                   每一位从0到9排列一遍;

                  递归的方法解决问题的能力;

        4.    字符串是一种简单、有效的表示大数的方法;


      

原创粉丝点击