C++
文章平均质量分 63
kay_zhyu
这个作者很懒,什么都没留下…
展开
-
KMP算法
设模式串(子串)为"p0...pm-1",KMP匹配算法的思想是:当模式串中的字符pj与主串中相应的字符Si不相等时,因其前j个字符("p0...pj-1")已经得到匹配,所以如果"p0...pk-1"="pj-k...pj-1"相同,这是可令pk与Si进行比较,从而使i无须每次都回退到0. 在KMP算法中,依据模式串的next函数值实现子串的滑动。若令next[j] =原创 2013-04-09 19:18:03 · 809 阅读 · 0 评论 -
面试100题之20实现Strstr函数
题目描述:函数原型:char *Strstr(char *pTarget, const char *pPattern),判断pPattern是否是pTarget的一个子串,如果是,返回第一个匹配点的指针,否则返回空。异常处理:若参数中有指针为NULL,返回NULL。如果pPattern是空串,返回整个pTarget。核心代码如下:#include/////实现strstr函数c原创 2013-08-17 19:11:28 · 933 阅读 · 1 评论 -
面试100题系列之5字符串的排列组合问题
1、字符串的组合输入一个字符串,找出字符串中所有字符的所有组合形式。比如说abcd,其组合形式有a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd。这里认为adb和abd是一样的情况。组合的情况也就是遇到一个字符,分两种情况,取当前这个字符,或者不取当前这个字符。然后对于每一个字符都做这样的考虑,典型的递归思路。void Range(char原创 2013-04-09 19:29:45 · 1007 阅读 · 0 评论 -
编程之美系列之栈和队列2—在O(1)的时间内得到队列的最大或者最小值
上一篇博客http://blog.csdn.net/kay_zhyu/article/details/8869542中提到,在O(1)的时间内取得栈的最大或者最小值,作法是利用一个辅助栈去动态的维护这个最小值。但是如果要在O(1)的时间内取得队列的最小值,那这就有点难办的吧。毕竟队列的操作特点是先进先出,跟栈的完全相反的,我们没办法像栈那要用一个动态的数组去维护这个最小值。怎么办呢?既然栈的最小值原创 2013-04-30 15:00:46 · 3843 阅读 · 3 评论 -
编程之美系列之栈和队列1—在O(1)的时间内得到栈的最大或者最小值
1、定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。对于找最大值其实是一个道理,这里就不废话了。要求:函数min、push、pop的时间复杂度都是o(1)这里用一个辅助栈去动态的维护栈的最小值,每次如果有新元素加进来,就和辅助栈的栈顶元素比较,如果新元素较小,把新元素push到辅助栈里面,如果新元素较大,将栈顶的元素拷贝到top+1里面。所以pop的时候直接--top就可以原创 2013-04-30 14:14:30 · 2672 阅读 · 1 评论 -
编程之美系列之二叉树2—二叉树的距离问题(续)
前面一篇博客:http://blog.csdn.net/kay_zhyu/article/details/8867839讲了二叉树的一些基本的操作,鉴于内容有点多,所以分成两个,这一部分主要是将怎么求给定的两个节点之间的距离。有两种情况:3、如果很频繁的询问两个节点的距离,那么就用一个二维数组来维护这个距离,询问的时间就是O(1).当然,如果只是一次询问,那这样做就很费时。OK,先不管那么原创 2013-04-30 10:31:20 · 1049 阅读 · 0 评论 -
面试100题系列之1将查找二叉树转换成有序的双向链表
1、将二元查找树转化成排序的双向链表,题目来源:http://blog.csdn.net/v_JULY_v/article/details/605728610/ \6 14/ \ / \4 8 12 16 => 468101216要求:不能创建节点,只改变指针的指向方法:其实就是树的中序遍历。用递归的方法build树,然后再将遍历到的节点一个一个的加到链表中去。#i原创 2013-04-30 13:39:33 · 1069 阅读 · 0 评论 -
面试100题系列之2字符串删除多余空格
其实就是删除多余的空格,其实两种方法,一种是在第一个遇到的单词前面加空格,这样的话需要考虑串首的情况。可以用flag来标记是不是句子的第一个单词。另一种方法是在单词结束的字符后面加空格,但需要考虑字符串以空格结尾的情况,遍历完字符串之后,直接判断最后一个元素是不是空格就可以了。第二种方法更直观一点。如果不仅仅是空格,还有回车。参考扩展问题及其再思考。#include#include原创 2013-04-22 21:38:28 · 870 阅读 · 0 评论 -
倒水问题1
思路分析:两个水杯,一大一小,要么用小水杯一直装满水,然后倒入大水杯中,要么一直用大水杯装满水,倒入小水杯中。这里假设每装一次水,则计数一次。最后输入两种方案下装水次数最少的方案。如果是小水杯装水,倒入大水杯中,那么就相当于用小水杯的倍数对大水杯取模,这样就得到一个循环数列。如果目标体积没有出现在这个数列中,说明这种方法不可行。同样如果是大水杯装水,倒入小水杯中,就相当于用大水杯的倍数对小原创 2013-04-12 14:00:36 · 1897 阅读 · 0 评论 -
面试100题系列之10关于删除多余空格的再思考
题目描述:1、无连续相邻的两个空格2、字符串开头和结尾无空格3、新的一行开头和结尾无空格要得满分,必须满足一下两个条件A、不能增加新的内存空间B、只能循环字符串一次C、不准用库函数参考代码:这样就可以从文件中读入换行符了#include// 写删除字符串中的空格的程序void main(){ char str[10000]; int flag原创 2013-03-20 17:05:00 · 931 阅读 · 0 评论 -
二叉树的遍历
这里为了方便,以二叉查找树为例:#include#include#define M 25struct BST{ int Data; BST *left; BST *right;};BST *stack[M];//栈int flag[M];//后序遍历中需要用到的标记数组bool AddNodeToBST(BST* &Root, int Value)原创 2013-04-05 14:24:42 · 596 阅读 · 0 评论 -
C++的虚拟继承机制
由于我对这方面不是很明白,所以只好实验来让我更好的理解,将结果记录在这里吧~理论我们采用第一个定义,也就是说被virtual所修饰的事物或现象在本质上是存在的,但是没有直观的形式表现,无法直接描述或定义,需要通过其他的间接方式或手段才能够体现出其实际上的效果。那么在C++中就是采用了这个词意,不可以在语言模型中直接调用或体现的,但是确实是存在可以被间接的方式进行调用或体现的。比如:虚函原创 2013-04-24 20:29:18 · 720 阅读 · 0 评论 -
面向对象编程——虚函数表和虚基类表
一、虚函数表每个含有虚函数的类有一张虚函数表(vtbl),表中每一项是一个虚函数的地址, 也就是说,虚函数表的每一项是一个虚函数的指针。没有虚函数的C++类,是不会有虚函数表的如果派生类是多重继承,则有多少个有虚函数的基类,就对应有多少个虚函数表。#include using namespace std;class Base1 {public: virtua原创 2013-04-04 11:33:57 · 1384 阅读 · 0 评论 -
关于类的sizeof
代码如下,这里我主要想看静态变量的内存是不是算在类中的。1、一开始定义一个空的类,什么都没有,sizeof(A)的结果是1.2、加入一个静态变量num,sizeof(A)的结果还是1。3、加入一个成员变量之后,sizeof(A)的结果变成4。4、其实如果在这里加入一个虚函数,sizeof之后会变成8,多了四个字节,因为有了虚函数,就多了一个指向vtable的指针。#includ原创 2013-04-06 09:26:49 · 732 阅读 · 0 评论 -
Effective C++学习笔记之第四章(1)
chapter 4:设计与声明item18:让接口容易被正确使用,不易被误用理想情况下应该是如果能编译通过,那么接口一定能实现你想要的,否则就不能编译假设正在设计一个表示时间数据的类的构造函数:Date(int month, int day, int year);这样会出现两个问题,一是传参的顺序不对,而是所传参数的取值范围不对。1)用户在传参的时候顺序不对。OK,也许你想到了用结原创 2013-04-14 10:52:37 · 1172 阅读 · 2 评论 -
strcpy,memset,memmove,memcpy的实现
面试题中,属字符串的题最难,这几个函数在中都有定义。用这几个函数练练手,有可能面试官就会问到有关的问题。另外补充一点,为什么这里的函数都要返回指针,因为可能这些函数需要嵌套使用。比如说strlen(strcpy(str1,str2));char *strcpy(char *strDest, const char *strSrc){ assert(strDest && strSrc);原创 2013-04-05 18:07:57 · 742 阅读 · 0 评论