代码的鲁棒性
来源:互联网 发布:51单片机40引脚是 引脚 编辑:程序博客网 时间:2024/05/19 12:36
文章转载自博客园 http://www.cnblogs.com/stemon/p/4624852.html
代码的鲁棒性
由于鲁棒性对于软件开发非常的重要,面试官在招聘的时候对应聘者写出的代码是否鲁棒也非常的关注。提高代码的鲁棒性的有效途径是进行防御性的编程。防御性编程的一个好的方法就是设计好的、全面的测试用例。如果我们能够把测试用例提前的写好,考虑到相应的问题,对鲁棒性做相应的处理,那么面试官会觉得我们的防御性编程的习惯很好。当然并不是所有的测试用例都是那么容易的一眼就能看出来。
查找链表的倒数第K个结点
这个题目真的是很简答的了,同时也是面试题目中很常见的问题,之所以拿出这个问题来说一说,就是为了增强自己写代码的习惯,让技术面试的HR看着自己很厉害的样子。在设计算法的题目的时候,要遵循一定的流程,这样才是好的习惯。
1>算法设计–运筹帷幄之中,决胜千里之外
遇到复杂的算法时,可以利用画图(树、图等数据结构的算法)、举例子(先利用一些小的例子梳理题目)、划分为小的子问题(分治或者动态规划的题目)。
2>测试用例的编写–兵马未动,粮草先行
注意边界条件输入、特殊输入、错误处理等。
3>代码实现
4>调试Bug
设置断点,单步跟踪,查看内存,分析调用栈。能迅速的找到问题,并解决问题。
对于求链表中倒数第K个结点的问题,这里只列出测试用例的编写,这部分很重要,不可小觑!
//对于传入函数的值,head和k的测试用例head = NULLk <= 0k 的值大于链表的结点数量
最后的代码实现:
ListNode* FindKthToTail(ListNode* head, unsigned int k){ if(NULL == head) { return NULL; } if(k <= 0) { return NULL; } ListNode *ptr = head; for(int i = 0; i < k - 1 && NULL != ptr; i++) { ptr = ptr->next; }//for if(NULL == ptr) { return NULL; }//if ListNode *pcur = head; while(NULL != ptr->next) { ptr = ptr->next; pcur = pcur->next; }//while return pcur;}
注意,这里对k的检验很重要,因为k是unsigned int类型的,如果传入的k值为0,那么k-1得到的并不是-1,而是4294967292(无符号的0xFFFFFFFF),因此for循环执行的次数远远的超过我们的预期的次数。同样会造成程序崩溃。
在调试Bug的时候发现,如果while循环中判断的不是ptr->next是否等于空值,而是判断ptr是否等于空值,是得不到正确结果的。所以上面的算法的设计步骤很重要。
查找链表的中间结点
和上面的代码思想相似,设置两个指针,都分别从头依次向后移动,只不过一个步长为1,一个步长为2。当快的指针到达结尾的时候,慢的指针正好达到链表的中间位置。
反转一个链表
这种反转链表的方法用到了三个指针,但是要考虑到各种的测试用例,包括链表为NULL,只有一个结点,有两个结点,有多个结点的情况。
ListNode* ReverseList(ListNode* pHead){ if(pHead == NULL || pHead->next == NULL) return pHead; ListNode *p = pHead; ListNode *q = pHead->next; ListNode *r = q->next; while(r != NULL) { q->next = p; p = q; q = r; r = r->next; } q->next = p; p = q; q = r; pHead->next = NULL; return p;}
反转一个链表也可以用递归的方式来实现。
- 代码的鲁棒性......
- 代码的鲁棒性
- 运行代码的代码
- 运行代码的代码
- 剑指offer 算法 (代码的鲁棒性)
- 什么是代码后面的代码
- JS:运行代码的代码
- 好的代码:傻瓜型代码
- 代码框 的代码
- 网页,运行代码,复制代码,代码另存的代码
- 代码鲁棒性
- 优秀的代码 vs. 糟糕的代码
- 优秀的代码 vs. 糟糕的代码
- 什么样的代码是合格的代码
- 优秀的代码VS糟糕的代码
- 鲁棒性的获得 —— 测试函数的代码框架
- 合并两个排序的链表:专注代码的鲁棒性.
- 剑指offer:(18)代码的鲁棒性:树的子结构
- Web Gallery: Unable to create the Web Deploymnet Tool DeploymentObject.
- [Codeforces148D]Bag of mice(概率dp)
- c语言深度学习转载
- Android中WebView控件支持地理位置定位
- Hadoop集群搭建过程中的常见问题(一)
- 代码的鲁棒性
- 1007. 素数对猜想 (20)
- 第二次上机作业
- Castle Windsor 学习-----Installer的几种安装方式
- 【算法】牛客网前端编程(1-10题)
- matplotlib画图不显示
- Ensemble Learning 集成学习
- BZOJ P3155Preprefix sum
- Struts2的输入校验