您的位置:首页 > Web前端

《剑指offer》笔记-第三章(2)

2017-07-10 21:51 99 查看
面试题18(1):删除链表的节点

       在O(1)时间内删除链表的节点,链表节点与函数定义如下:

          StructListNode{int m_nValue; ListNode* m_pNext;}

          VoidDeleteNode(List** pListHead,ListNode* pToBeDeleted)

测试用例:

         功能测试:删除头结点、中间节点、尾节点;

         特殊输入:只有一个节点的链表、链表头指针是null;要删除的节点指针是null;

分析:

       1.    要删除节点,常规方法是把它前一个节点的指针指向它后一个节点;该链表是单项链表,从一个节点只能得到它的后一个节点,要得到前一个节点,只能顺序遍历链表;这样的删除操作复杂度是O(n);

       2.    打破常规思维,要删除一个节点不一定删除这个节点本身,将下一个节点的内容复制到这个节点上,再删除下一个节点;

       3.    删除尾节点,由于没有下一个节点,需要从头遍历链表;

       4.    只有一个节点的链表,删除后头指针置为null;

       5.    该方法需要确保要删除的节点在链表中

面试题18(1):删除链表的节点

       删除重复的节点

测试用例:

        功能测试:重复节点位于链表头、中、尾;没有重复节点;

        特殊输入:只有一个节点的链表、链表头指针是null;所有节点都重复;

分析:

      1.    确定删除函数的参数,由于可能删除头结点(指向头结点的指针会变),函数没有返回值,则参数应该是指向头结点指针的指针;

             deleteDuplication(ListNode** pHead);

      2.    从头遍历链表

面试题19:正则表达式匹配

       设计一个函数匹配包含“.”“*”的正则表达式;

       “.”表示任意一个字符;

       “*”表示它前面的字符可以出现任一次(含0);

测试用例:

       功能测试:模式字符串含有普通字符、“.”、“*”;不匹配的情况;

       特殊输入:输入字符串/模式字符串是null;输入字符串是空字符串;

分析:

      1.    递归的方法match(char* str, char*parttern),每次操作*str、*(str+1);

      2.    *(parttern+1)是“*”, 如果*str和*parttern匹配/*parttern是“.”,

             可以match(str+1, parttern+2),//匹配了1次

            可以match(str+1, parttern),//匹配了多次

            可以match(str, parttern+2),//匹配了0次

            如果*str和*parttern不匹配,并且*parttern不是“.”,

            则match(str, parttern+2)//匹配了0次

      3.    *(parttern+1)不是“*”,如果*str和*parttern匹配/*parttern是“.”,则可以match(str+1,parttern+1);

面试题20:表示数值的字符串

        实现一个函数,判断字符串是否表示数值(整数、小数、带指数的数)

测试用例:

        功能测试:正数/负数;包含/不包含整数部分(如.123);包含/不包含小数部分;包含/不包含指数部分(指数部分只能是整数);各种非有效数字字符串;

        特殊输入:输入字符串null;输入字符串是空字符串;

分析:

       1.    数字字符串遵循的模式是:A[.[B]][e|EC]或者.B[e|EC],A为整数部分,B为小数部分,C为指数部分

       2.    A可以以+-开头,且是0到9的字符,也可以没有(.123=0.123);

       3.    B是0到9的字符,也可以没有字符(123.=123.0),不能以+-开头;

       4.    C可以以+-开头, 且是0到9的字符,e前面不能没有数字(.e1、e1是无效的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: