2013年9月8日

《剑指offer》面试题7—用两个栈实现队列

摘要: 题目:给出队列声明,要求实现AppendTail和DeleteHead函数。template class CQueue{public: void AppendTail(const T& element); T DeleteHead();private: stack stack1; stack stack2;};思路:要用两个先进后出的栈实现先进先出的队列。压栈总是压入stack1,要获得队列头时:如果stack2为空,则把stack1依次弹出栈并压入stack2,取stack2栈顶元素;如果stack2不为空,则直接取stack2栈顶元素。 1 #include 2 ... 阅读全文

posted @ 2013-09-08 17:03 CnZyy 阅读(227) 评论(0) 推荐(0) 编辑

《剑指offer》面试题17—合并两个排序链表

摘要: 题目:输入两个递增排顺序的链表,合并这两个链表并使合并后的链表仍是递增排序的。重点:1.代码鲁棒性:要判断输入的两个链表都为NULL;其中一个链表为NULL的情况。2.用递归实现,注意递归的思路。 1 #include 2 3 using namespace std; 4 5 struct Node 6 { 7 int val; 8 Node* next; 9 };10 11 12 void PrintLink(Node* phead)13 {14 Node* p = phead;15 while(p != NULL)16 {17 ... 阅读全文

posted @ 2013-09-08 10:39 CnZyy 阅读(310) 评论(0) 推荐(0) 编辑

《剑指offer》面试题16—反转链表

摘要: Node* p1 p2 p3思路:开始时,p1为NULL,p2=phead,p3=p2—>next。使p2—>next = p1,然后使p1=p2,p2=p3。如果只有1个结点则此时p2为NULL,结束循环;否则继续执行,直到p2为NULL。注意:注意代码鲁棒性!判断头结点为NULL;如果只有一个结点。 1 #include 2 using namespace std; 3 4 5 class Node 6 { 7 public: 8 Node(int v, Node* n) 9 {val = v;10 next = n;}11 ~Node(){}12 ... 阅读全文

posted @ 2013-09-08 10:06 CnZyy 阅读(274) 评论(0) 推荐(0) 编辑

2013年9月7日

《剑指offer》面试题15—输出链表中倒数第n个结点

摘要: 题目:如题,且从1开始计数。思路:要求只遍历一遍链表:设置两个指针,一个先走n步后另一个开始同步后移,当快指针已经到链表尾时慢指针正好到要输出的结点。注意:本题思路比较好想到,主要考察的是代码的鲁棒性!要判断输入参数是否尾空指针,以及n是否有效。 1 #include 2 using namespace std; 3 4 5 class Node 6 { 7 public: 8 Node(int v, Node* n) 9 {val = v; 10 next = n;} 11 ~Node(){} 12 int val; 13 ... 阅读全文

posted @ 2013-09-07 22:40 CnZyy 阅读(328) 评论(0) 推荐(0) 编辑

《剑指offer》面试题13—O(1)时间删除链表结点

摘要: 题目:给定单向链表的头指针和某结点指针,实现函数在O(1)时间内删除指定节点。思路:由于没有要删除结点(j结点)的前一个结点(i结点)指针,通常想法是从头开始遍历找到指定结点的前一个结点(i结点),然后使i结点的指针指向j结点的后一个结点k结点。但是这样是O(n)的时间复杂度,不符合要求。解决方法很巧妙:由于有要删除的j结点的指针,因此可以很容易得到j结点的后一个结点k结点的指针,只要把k结点的内容复制给i结点,然后删除k结点即可。但是要注意!如果链表只有一个结点,head指针要指NULL;如果要删除的是尾结点,即后面没有结点了,那么也只能从头开始遍历。 1 #include 2 usi... 阅读全文

posted @ 2013-09-07 22:22 CnZyy 阅读(415) 评论(0) 推荐(0) 编辑

《剑指offer》面试题5—从尾到头打印链表

摘要: 重要思路:这个问题肯定要遍历链表,遍历链表的顺序是从头到尾,而要输出的顺序却是从尾到头,典型的“后进先出”,可以用栈实现。注意stl栈的使用,遍历stack的方法。 1 #include 2 #include 3 using namespace std; 4 5 class Node 6 { 7 public: 8 Node(int v, Node* n) 9 {val = v;10 next = n;}11 ~Node(){}12 int val;13 Node* next;14 };15 Node * phead = NULL;16 1... 阅读全文

posted @ 2013-09-07 19:27 CnZyy 阅读(226) 评论(0) 推荐(0) 编辑

C++虚继承作用

摘要: C++虚继承可以防止多重继承产生的二义性问题。 虚继承,就是在被继承的类前面加上virtual关键字,这时被继承的类称为虚基类,如下面代码中的base类。虚继承在多重继承的时可以防止二义性。class baseclass derived1 : virutal public baseclass derived2 : virtual public baseclass derived3 : public derived1, public derived2以上的代码如果用到了base中的某个成员变量就不会产生二义性。和#progma once在头文件中的作用类似。请看下面的例子:#include us 阅读全文

posted @ 2013-09-07 11:23 CnZyy 阅读(1274) 评论(0) 推荐(0) 编辑

2013年9月6日

C++多态性:虚函数的调用原理

摘要: 多态性给我们带来了好处:多态使得我们可以通过基类的引用或指针来指明一个对象(包含其派生类的对象),当调用函数时可以自动判断调用的是哪个对象的函数。一个函数说明为虚函数,表明在继承的类中重载这个函数时,当调用这个函数时应当查看以确定调用哪个对象的这个函数。普通函数的处理:一个特定的函数都会映射到特定的代码,无论时编译阶段还是连接阶段,编译器都能计算出这个函数的地址,调用即可。虚函数的处理:被调用的函数不仅依据调用的特定函数,还依据调用的对象的种类。通常是由虚函数表(vtable)来实现的。虚函数表的结构:它是一个函数指针表,每一个表项都指向一个函数。任何一个包含至少一个虚函数的类都会有这样一张表 阅读全文

posted @ 2013-09-06 22:44 CnZyy 阅读(446) 评论(0) 推荐(0) 编辑

2013年9月5日

《剑指offer面试题4》替换空格——实现函数把字符串中每个空格替换成“%20”

摘要: 思路:例如把we are happy这个字符串中所有空格替换成"%20",最直接的做法是从头开始扫苗,遇到空格就替换,并且把空格后面的字符都顺序后移。复杂度O(n^2)。重要思想(这个从后往前的思想特别重要,举一反三的例子也是):先扫描一遍字符串统计出空格数量blanknum,由于每个空格被替换成3个字符"%20",即每替换一个空格总长度增加2,因此最后总的长度应该是原长+blanknum*2。然后对字符串从后往前扫描,不是空格的直接移动到新位置,如果是空格替换成%20。 1 #include 2 #include 3 #define maxlen 10 阅读全文

posted @ 2013-09-05 22:28 CnZyy 阅读(829) 评论(0) 推荐(0) 编辑

2013年8月16日

《剑指offer》面试题1:为类CMyString添加赋值运算符函数——C++拷贝构造函数与赋值函数

摘要: 题中已给出CMyString的类定义,要求写赋值运算符函数。 1 #include 2 #include 3 using namespace std; 4 5 class CMyString 6 { 7 public: 8 CMyString(char* pdata = NULL); 9 CMyString(const CMyString& rstring);10 CMyString& operator = (const CMyString& rstring);11 void Show();12 ~CMyString();13 private:14 ... 阅读全文

posted @ 2013-08-16 23:36 CnZyy 阅读(760) 评论(0) 推荐(0) 编辑

导航