代码的鲁棒性

文章转载自博客园 http://www.cnblogs.com/stemon/p/4624852.html

代码的鲁棒性

由于鲁棒性对于软件开发非常的重要,面试官在招聘的时候对应聘者写出的代码是否鲁棒也非常的关注。提高代码的鲁棒性的有效途径是进行防御性的编程。防御性编程的一个好的方法就是设计好的、全面的测试用例。如果我们能够把测试用例提前的写好,考虑到相应的问题,对鲁棒性做相应的处理,那么面试官会觉得我们的防御性编程的习惯很好。当然并不是所有的测试用例都是那么容易的一眼就能看出来。

查找链表的倒数第K个结点

这个题目真的是很简答的了,同时也是面试题目中很常见的问题,之所以拿出这个问题来说一说,就是为了增强自己写代码的习惯,让技术面试的HR看着自己很厉害的样子。在设计算法的题目的时候,要遵循一定的流程,这样才是好的习惯。

1>算法设计–运筹帷幄之中,决胜千里之外

遇到复杂的算法时,可以利用画图(树、图等数据结构的算法)、举例子(先利用一些小的例子梳理题目)、划分为小的子问题(分治或者动态规划的题目)。

2>测试用例的编写–兵马未动,粮草先行

注意边界条件输入、特殊输入、错误处理等。

3>代码实现

4>调试Bug

设置断点,单步跟踪,查看内存,分析调用栈。能迅速的找到问题,并解决问题。

对于求链表中倒数第K个结点的问题,这里只列出测试用例的编写,这部分很重要,不可小觑!

//对于传入函数的值,head和k的测试用例
head = NULL
k <= 0
k 的值大于链表的结点数量

最后的代码实现:

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;
}

  反转一个链表也可以用递归的方式来实现。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab鲁棒性代码是指能够在不同环境、不同数据输入下保持稳定性和可靠性的代码。编写鲁棒性代码需要考虑到各种可能出现的情况,并针对性地处理这些情况,以确保程序能够正确运行并产生正确的结果。 首先,编写鲁棒性代码需要进行有效的输入检查和错误处理。在接受用户输入时,需要对输入进行验证,以防止不合法的输入导致程序出错。对于可能出现的错误情况,需要编写相应的错误处理代码,以确保程序在出现错误时能够恰当地处理并继续执行。 其次,对于可能出现异常的情况,也需要进行相应的处理。可能出现的异常包括数据缺失、数据格式错误、计算结果溢出等,需要编写相应的异常处理代码,以确保程序能够在出现异常时不崩溃,并进行合适的处理。 另外,编写鲁棒性代码还需要考虑到程序运行的环境和条件。在不同的操作系统、不同的 Matlab 版本下,可能会存在一些差异,需要对这些差异进行相应的处理,以确保程序能够在不同环境下正常运行。 总的来说,编写鲁棒性代码需要考虑到各种可能出现的情况,并针对性地进行有效的输入检查、错误处理和异常处理,同时兼顾不同的运行环境和条件,以确保程序能够保持稳定性和可靠性。这样的代码不仅能够降低程序出错的概率,还能够提高程序的可维护性和可移植性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值