《剑指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是无效的)
在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是无效的)
相关文章推荐
- 《剑指offer》笔记-第三章(3)
- 《剑指offer》第三章高质量的代码笔记
- 《剑指offer》第三章高质量的代码笔记
- C++primer 第三章学习笔记(string篇)
- Spring学习笔记:第三章 IoC中的国际化
- Pro visual c++/cli and .net 2.0 platform2 学习笔记(9第三章 面向对象的C++/CLI==2)
- Spring in Action 学习笔记—第三章创建切面
- 《TC++PL》第三章笔记
- Spring学习笔记:第三章 IoC中的国际化
- Modern C++ Design 笔记 第三章 3. TypeList
- 代码大全2笔记-第三章-前期准备
- Win32学习笔记 第三章 HelloWin
- 《HTML & XHTML权威指南》的学习笔记01 -- 第三章.HTML/XHTML文档的元素
- JavaScript 中级笔记 第三章
- FirstSample相关 《Java核心技术:卷1》第三章笔记
- 高效掌握C#笔记[第三章]C#基础知识
- ASP.net(1.1)原理学习笔记--第三章 配置Configuration
- [原创]Pro Hibernate 3笔记和小结(8)之第三章创建简单应用
- Asp学习笔记第三章
- JavaScript 中级笔记 第三章