【有书共读】《剑指offer》 第三章:高质量代码 ​

开篇通过职场高人的话点醒我们:代码一定要考虑异常状况和资源回收等问题,要提高自己的代码容错处理能力;即便粗心犯错必将一点就会,基本知识点一定要掌握牢固,并且高质量的代码一定要命名规范。
3.2 代码的规范性
影响代码规范性的因素:书写、规范和布局
建议:最好用完整的英文单词组会命名变量和函数
3.3 代码的完整性
表现在代码的基本功能、边界值正确率、合理的错误处理(不合规范的非法输入)。
1. 3方面确保代码的完整性:功能测试、边界测试和负面测试设计测试用例。
功能测试:突破常规思维的限制,比如“打印1到最大的n位数”,n为任意大时,int表示不了,可采用字符串或者数组表示大数。
边界测试:循环递归的终止边界条件的正确性
负面测试:考虑各种可能的错误的输入,例如函数完成需求功能应当考虑不符合要求的输入的合理的错误处理。参考面试题14“调整数组顺序使奇数位于偶数的前面“关于可扩展性和可维护性讨论。
2. 3种错误处理方法
函数返回值:使用不便,因为函数不能吧计算结果通过返回值赋值给其他变量,也不能吧这个函数计算的结果直接作为参数传递给其他函数。
当发生错误时设置一个全局变量:可以在返回值中传递计算结果,但是调用者忘记检查全局变量从而在调用出错的时候忘记做相应的错误处理,从而留下安全隐患。
抛出异常:try/catch模块,跑出异常会打乱程序正常执行的顺序,对程序性能有很大的影响。
面试题16.数值的整数次方
思路:需要考虑到各种情况,比如指数为正数和负数时的不同运算情况,底数为零的异常情况。仅考虑到所有取值情况勉强过关,但是能够优化代码的效率是一个加分项。此题可参考O(logn)时间求斐波那契数列的算法,采用递归思路求解提高计算效率。(细节决定成败)
考点:考察思维的全面性,可能会忽视底数为0而指数为负数的情况;考察快速乘方能力。
面试题17:打印从1到最大的n位数
思路:大数问题。在字符串上模拟数字的加法,采用n+1位字符数组表示n位数(最后一位为‘\0’),但是要注意两点1.字符数组每次加1需要判断是否达到了最大的n位数(第一个字符产生进位)2.按照阅读的习惯打印字符数组,去掉前面的’0’。此题的另一种思路即n位所有的十进制数其实是n个0-9的全排列,用递归的全排列解决(递归的结束条件是我们已经设置了数字的最后一位)。
考点:考察解决大数问题能力;第一种思路考察对已经到了最大n位数的判定;第二种思路考察递归方法解决问题的能力;考察软件设计能否考虑用户的使用习惯,比如打印时去掉不相干的0.
面试题18:删除链表的节点在O(1)时间内
思路:根据当前要删除节点,找到下一节点,将当前节点的下一节点复制到当前节点,删除当前节点的下一节点即可。此题要分情况考虑: 当前节点为头节点;当前节点为尾节点以及当前节点既非头节点也非尾节点。
考点:链表的编程能力;创新思维能力以及思维的全面性。
面试题19:正则表达式匹配
思路:每次从字符串拿出一个字符和模式串匹配。
考点:字符串的编程能力;正则表达式的理解;思维的全面性
面试题20:表示数值的字符串
思路:主要是字符模式的匹配
考点:字符串的编程能力;分析问题的能力以及思维的全面性
面试题21:调整数组顺序使奇数位于偶数前面
思路:采用两个指针分别从前往后和从后往前移动,第一个为偶数第二个为奇数则交换
考点:考察快速思维能力,可扩展性理解以及代码的重用性
3..4 代码的鲁棒性
面试题22:链表中倒数第k个节点
思路:对两个指针,第一个向前走k-1步之后第二个再移动,可实现遍历一次链表即可找出该节点,同时要考虑3中特殊情况的分别处理,否则代码易崩溃。
考点:链表理解;代码鲁棒性。
面试题23:链表中环的入口节点
思路:定义一快一慢两指针,确定包含环,进一步确定环中节点的数目和环的入口节点。
考点:对链表的理解能力;代码的鲁棒性;分析问题的能力,一个复杂的问题分解成几个简单的步骤。
面试题24:反转链表
思路:调整节点i的mpNext同时保存节点j,防止断开
考点:对链表和指针的编程能力,注重思维的全面性和代码的鲁棒性
面试题25:合并两个排序链表
思路:采用递归的思想,每次取两个链表中较小的节点并链接到要合并的链表
考点:大量的指针操作能力,对于引入的空指针的处理
面试题26:数的子结构
思路:针对数的操作涉及大量指针,同一般情况采用递归的方法,注意边界条件的检查。该题中节点的值为double类型,判断接待你相等的时候不能直接采用“==”,需要定义一个Eual函数比较double 是否相等。
考点:二叉树遍历算法的理解和递归编程能力;防御性编程方式,考虑指针是否为空。
3.5本章小结
本章从规范性、完整性和鲁棒性3个方面介绍了如何在面试中写出高质量代码。在白纸书写时应尽量清晰的书写每个字母,缩进、括号对齐等布局合理,合理命名代码的变量和函数;编码之前要考虑所有可能输入(边界条件,错误处理);养成防御性编程习惯,确保写出代码不会轻易崩溃。

全部评论

相关推荐

评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务