随笔分类 -  《Cracking the coding interview》

参照以下作者blog,练手记录 作者:Hawstein 出处:http://hawstein.com/posts/ctci-solutions-contents.html
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:写程序在一棵二叉树中找到两个结点的第一个共同祖先。不允许存储额外的结点。注意: 这里不特指二叉查找树。思路:首先,理解题义:不允许储存额外的结点。指的是,2叉树结点中除了左右孩子结点不应该有别的结点。然后,根节点一定是两个结点的祖先。那么我们只要向下遍历根节点的孩子,直到找到符合条件的最后一个祖先节点即可。CODE: 1 #include 2 #include 3 #define N 9 /*树的结点数*/ 4... 阅读全文
posted @ 2014-03-29 10:52 哈士奇.银桑 阅读(193) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:给定二叉查找树的一个结点, 写一个算法查找它的“下一个”结点(即中序遍历后它的后继结点), 其中每个结点都有指向其父亲的链接。思路:题目是在升序排列的情况下,查找他的下一个的节点。先在它的右孩子里找最小的节点,即下一个节点;如果没有右孩子,那么向上找它的父亲节点,直到找到比他大的父亲节点,即下一个节点。(如果他是他父亲节点的右孩子,那么继续向上找直到找到某个节点是其父亲节点的左孩子,那么该父亲节点就是所找的下一个节点;如果他 阅读全文
posted @ 2014-03-25 16:17 哈士奇.银桑 阅读(163) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:给定一棵二叉查找树,设计算法,将每一层的所有结点构建为一个链表(也就是说, 如果树有D层,那么你将构建出D个链表)思路:定义一个保存链表头节点指针的数组,现将2叉树跟节点放入到数组p_nl[0]中,跟节点层就一个节点,跟节点层链表构建完毕。进行循环,遍历已构造的链表,将链表中的节点的孩子节点插入到新链表。最后,直到遍历完叶子节点链表。链表全部构造完成。其中有不相关的代码。CODE: 1 #include 2 #inclu.. 阅读全文
posted @ 2014-03-22 16:36 哈士奇.银桑 阅读(404) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树。思路:取数组中间元素当作二叉树的根,递归插入。CODE: 1 #include 2 #include 3 #include 4 #define N 6 5 #define key(A) (A) 6 #define less(A,B) (Aend)16 return;17 (*h)=(node *)malloc(sizeof(node));1... 阅读全文
posted @ 2014-03-20 08:51 哈士奇.银桑 阅读(124) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:实现一个函数检查一棵树是否平衡。对于这个问题而言, 平衡指的是这棵树任意两个叶子结点到根结点的距离之差不大于1。思路:找这棵树的最高层max,和最低层min,比较下即可。CODE: 1 #include 2 #include 3 #include 4 #define N 6 5 #define key(A) (A) 6 #define less(A,B) (Aitem=item;18 (*h)->l=NULL... 阅读全文
posted @ 2014-03-19 14:31 哈士奇.银桑 阅读(99) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:写程序将一个栈按升序排序。对这个栈是如何实现的,你不应该做任何特殊的假设。 程序中能用到的栈操作有:push | pop | peek | isEmpty。思路:需要一个额外的栈ss[1],原栈ss[0]弹出数据data,当ss[1]为空时候,直接压入;ss[1]不为空时,如果ss[1]的栈顶数据大于ss[0]弹出的数据data时,弹出ss[1]数据,压入ss[0]中,知道ss[1]中的数据不大于ss[0]弹出的data,压 阅读全文
posted @ 2014-03-18 15:40 哈士奇.银桑 阅读(139) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:使用两个栈实现一个队列MyQueue。思路:一个入栈(ss[0]),另一个(ss[1])将ss[0]弹出的数据压入,这样就可以先进先出(FIFO)了。CODE: 1 #include 2 #define N 10 /*栈的长度*/ 3 typedef struct 4 { 5 int s[N]; 6 int top; 7 }struct_stack; 8 int ssFull(struct_stack... 阅读全文
posted @ 2014-03-17 10:51 哈士奇.银桑 阅读(137) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:编程解决汉诺塔问题,使用数据结构栈.思路:1.递归:分成3个状态:将src上的1~n-1个盘子借助dst移到bri上。将src上的剩下的第n个盘子移动到dst上。将bri上的1~n-1个盘子借助src移动到dst上。参考:http://hawstein.com/posts/3.4.html2.使用栈的非递归:另一种汉诺塔移动方式:3个柱子呈品字型放置,形成循环。如果盘子数目n是奇数,那么排放方式:A-》C-》B;如果是偶数, 阅读全文
posted @ 2014-03-14 21:10 哈士奇.银桑 阅读(180) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:栈就像叠盘子,当盘子叠得太高时,就会倾斜倒下。因此,在真实的世界中,当一叠盘子 (栈)超过了一定的高度时,我们就会另起一堆,再从头叠起。实现数据结构SetOfStacks 来模拟这种情况。SetOfStacks由几个栈组成,当前一栈超出容量时,需要创建一个新的栈 来存放数据。SetOfStacks.push()和SetOfStacks.pop()的行为应当和只有一个栈时 表现的一样。进一步地,实现函数popAt(int in 阅读全文
posted @ 2014-03-13 09:22 哈士奇.银桑 阅读(134) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值。 push,pop和min函数的时间复杂度都为O(1)。思路:额外建立一个保存栈中目前最小值的数组gpStacMin[],如果入栈的数据小于等于gpStacMin中的栈顶数据,同时入栈。弹出时候,只要弹出的栈顶元素和gpStacMin中的栈顶数据相等,同时弹出。 1 #include 2 #include 3 #define N 10 4 int * 阅读全文
posted @ 2014-03-11 09:17 哈士奇.银桑 阅读(150) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:你如何只用一个数组实现三个栈?思路:创建一个结构数组sn,数组中的每个元素将是这样一个结点,它保存当前位置的值item,和指向上一个结点的索引preindex。这样弹出该栈的栈顶值时,可以找到上一个该栈元素。注意:当弹出栈顶值时,如果该栈顶索引小于数组当前的索引C,那么将C指向该栈顶索引。这样可以不浪费空间。CODE: 1 #include 2 #include 3 #define N 10 4 #define EMPTY 阅读全文
posted @ 2014-03-10 10:48 哈士奇.银桑 阅读(155) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:给定一个循环链表,实现一个算法返回这个环的开始结点。定义:循环链表:链表中一个结点的指针指向先前已经出现的结点,导致链表中出现环。例子:输入:A -> B -> C -> D -> E -> C [结点C在之前已经出现过]输出:结点C思路:见原作者blog:http://hawstein.com/posts/2.5.htmlCODE: 1 #include 2 #include"lis 阅读全文
posted @ 2014-03-09 13:58 哈士奇.银桑 阅读(138) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:你有两个由单链表表示的数。每个结点代表其中的一位数字。数字的存储是逆序的, 也就是说个位位于链表的表头。写一函数使这两个数相加并返回结果,结果也由链表表示。例子:(3 -> 1 -> 5), (5 -> 9 -> 2)输入:8 -> 0 -> 8思路:注意3点:两链表为空、两链表长度不一样、最后结果有进位。CODE:list.h可以参考CCI——Q2.3客户程序: 1 #include 2 阅读全文
posted @ 2014-03-07 09:01 哈士奇.银桑 阅读(147) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针。例子:输入:指向链表a->b->c->d->e中结点c的指针结果:不需要返回什么,得到一个新链表:a->b->d->e思路:int removeNode(link):将后一个点删除,将后一个节点的数据复制到该点。需要注意节点C是不是头节点,尾节点。Talk is cheap,Show me CODE:接口 lish.h 阅读全文
posted @ 2014-03-06 14:17 哈士奇.银桑 阅读(205) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:实现一个算法从一个单链表中返回倒数第n个元素。思路:findNthRecursion(link):递归的调用单链表的下一个节点,直到到达链表的尾部。此时,开始计数,直到到倒数第nn个数时,返回此时的h,即pp。 缺点是需要定义两个全局变量。link findNthToLast(link,int):定义两个指针p和q,使p和q之间差距n个距离,当p指向NULL时,q就指向了倒数第n个数。Talk is... 阅读全文
posted @ 2014-03-05 15:16 哈士奇.银桑 阅读(138) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.html一.Q:从一个未排序的链表中移除重复的项进一步地,如果不允许使用临时的缓存,你如何解决这个问题?思路:removedulicate():额外开一Boolen数组dulicate[N]存放链表中的数据,遍历链表,将链表的item对应的数组中的元素设为真。如果某元素在数组中为真,证明它前面出现过,删除即可。缺点:链表的item类型为int型时,1,可能为负值;2,浪费空间。removeDulicate():双层循环遍历链表,重复即删 阅读全文
posted @ 2014-03-04 10:51 哈士奇.银桑 阅读(479) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.html一.Q:假设你有一个isSubstring函数,可以检测一个字符串是否是另一个字符串的子串。 给出字符串s1和s2,只使用一次isSubstring就能判断s2是否是s1的旋转字符串, 请写出代码。旋转字符串:"waterbottle"是"erbottlewat"的旋转字符串。思路:将字符串s1+s1,再判断s2是不是s1+s1的子串,如果是,s2就是s1的旋转字符串。eg:s1:abcd 阅读全文
posted @ 2014-03-03 08:37 哈士奇.银桑 阅读(115) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.html一.Q:写一个函数处理一个N×M的矩阵,如果矩阵中某个元素为0,那么把它所在的行和列都置为0.思路:额外申请两个数组row[N],col[M],如果元素s[i][j]等于0,那么row[i]和col[j]都等于0,最后重新遍历数组,将行列对应的元素设为0.CODE: 1 #include 2 #include 3 #define N 4 4 #define M 4 5 void zero(int s[][M] ) 6 阅读全文
posted @ 2014-03-02 16:44 哈士奇.银桑 阅读(167) 评论(0) 推荐(0)
摘要:本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.html一.Q: 一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度。 你能原地进行操作吗?(即不开辟额外的存储空间)思路:见:http://hawstein.com/posts/1.6.htmlCODE: 1 #include 2 #define N 4 3 #define exch(A,B) {int t=A;A=B;B=t;} 4 void transpose(int s[][N]) 5 { 6 .. 阅读全文
posted @ 2014-03-01 08:56 哈士奇.银桑 阅读(132) 评论(0) 推荐(0)
摘要:本文参考该作者文章:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.html一.Q:写一个函数,把字符串中所有的空格替换为%20 。思路:int *replace1(char[],int):首先计算字符串中的空格的数量,新字符串的长度应该是多2cnt数量的长度(每个空格替换为%20需要增加2个字符,x个空格增加2x个字符)。申请一个额外数组,将原数组复制到新数组即可。replace2(char[],int):如果原数组长度够大,可以从后向前将字符串复制到原数组中。CODE: 1 #include 2 #includ 阅读全文
posted @ 2014-02-28 09:20 哈士奇.银桑 阅读(165) 评论(0) 推荐(0)