My Github

随笔分类 -  【012】计算机专业基础

数据结构与算法、操作系统原理、计算机网络原理、深入理解计算机系统...
摘要:题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。要求时间复杂度为O(n)。最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是O(n2),但是不满足要求。 阅读全文
posted @ 2015-09-14 23:07 EdisonZhou 阅读(11177) 评论(38) 推荐(9) 编辑
摘要:题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。 阅读全文
posted @ 2015-09-13 16:57 EdisonZhou 阅读(11175) 评论(0) 推荐(2) 编辑
摘要:题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。 阅读全文
posted @ 2015-09-13 12:02 EdisonZhou 阅读(4264) 评论(0) 推荐(1) 编辑
摘要:题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。这道题是典型的TopK问题,其最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。这种思路的时间复杂度是O(nlogn),但是面试官会要求时间复杂度保持在O(n)。 阅读全文
posted @ 2015-09-11 00:59 EdisonZhou 阅读(6882) 评论(0) 推荐(2) 编辑
摘要:题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。我们可以把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。 阅读全文
posted @ 2015-09-09 23:19 EdisonZhou 阅读(3502) 评论(0) 推荐(1) 编辑
摘要:题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入下图中左边的二叉搜索树,则输出转换之后的排序双向链表。我们知道:在二叉树中,每个结点都有两个指向子结点的指针。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。由于这两种结点的结构相似,同时二叉搜索树也是一种排序的数据结构,因此在理论上有可能实现二叉搜索树和排序的双向链表的转换。 阅读全文
posted @ 2015-09-09 00:57 EdisonZhou 阅读(5900) 评论(1) 推荐(3) 编辑
摘要:题目:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个Next指针指向下一个结点外,还有一个Sibling指向链表中的任意结点或者NULL。下图是一个含有5个结点的复杂链表。图中实线箭头表示m_pNext指针,虚线箭头表示m_pSibling指针。为简单起见,指向NULL的指针没有画出。 阅读全文
posted @ 2015-09-07 23:22 EdisonZhou 阅读(5491) 评论(0) 推荐(1) 编辑
摘要:题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。例如输入下图中二叉树和整数22,则打印出两条路径,第一条路径包含结点10、12,第二条路径包含结点10、5和7。 阅读全文
posted @ 2015-09-06 23:40 EdisonZhou 阅读(1814) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。例如在下面的一颗二叉搜索树中,输入数组{5,7,6,9,11,10,8},则返回true,因为这个整数序列是下图二叉搜索树的后序遍历结果。如果输入的数组是{7,4,6,5},由于没有哪棵二叉搜索树的后序遍历的结果是这个序列,因此返回false。 阅读全文
posted @ 2015-09-04 00:00 EdisonZhou 阅读(2157) 评论(0) 推荐(0) 编辑
摘要:题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入下图中的二叉树,则依次打印出8、6、10、5、7、9、11。这道题实质是考查树的层次遍历(广度优先遍历)算法。不管是广度优先遍历一个有向图还是一棵树,都要用到队列。 阅读全文
posted @ 2015-09-03 10:23 EdisonZhou 阅读(2371) 评论(0) 推荐(0) 编辑
摘要:题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。 阅读全文
posted @ 2015-09-03 00:04 EdisonZhou 阅读(5290) 评论(0) 推荐(2) 编辑
摘要:题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。这里我们要实现的就是min、push以及pop三个方法。 阅读全文
posted @ 2015-09-02 00:51 EdisonZhou 阅读(3189) 评论(0) 推荐(0) 编辑
摘要:题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如下图所示,左图是原二叉树,而右图则是该二叉树的镜像。我们可以先序遍历原二叉树的每个节点,如果遍历到的结点有子结点,就交换它的两个子结点。当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。 阅读全文
posted @ 2015-08-31 23:36 EdisonZhou 阅读(4498) 评论(0) 推荐(0) 编辑
摘要:题目:输入两棵二叉树A和B,判断B是不是A的子结构。例如下图中的两棵二叉树,由于A中有一部分子树的结构和B是一样的,因此B是A的子结构。要查找树A中是否存在和树B结构一样的子树,我们可以分成两步:Step1.在树A中找到和B的根结点的值一样的结点R;Step2.判断树A中以R为根结点的子树是不是包含和树B一样的结构。很明显,这是一个递归的过程。 阅读全文
posted @ 2015-08-30 23:05 EdisonZhou 阅读(4440) 评论(0) 推荐(1) 编辑
摘要:这也是一道出镜率极高的面试题,我相信很多童鞋都会很眼熟,就像于千万人之中遇见不期而遇的人,没有别的话可说,唯有轻轻地问一声:“哦,原来你也在这里? ”题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入下图中的链表1和链表2,则合并之后的升序链表如链表3所示。 阅读全文
posted @ 2015-08-30 20:09 EdisonZhou 阅读(3418) 评论(0) 推荐(0) 编辑
摘要:题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。由于题目并没有要求必须原地反转,因此可以借助外部空间实现。这里可以将单链表储存为数组,然后按照数组的索引逆序进行反转。但是,此方式比较浪费空间,而且需要两次遍历,效率不占优势。 阅读全文
posted @ 2015-08-29 20:32 EdisonZhou 阅读(24799) 评论(1) 推荐(7) 编辑
摘要:题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。 阅读全文
posted @ 2015-08-29 15:04 EdisonZhou 阅读(15061) 评论(2) 推荐(4) 编辑
摘要:题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。例如有以下一个整数数组:12345,经过调整后应该为:15342、13542、13524等等。 阅读全文
posted @ 2015-08-29 13:03 EdisonZhou 阅读(5503) 评论(1) 推荐(1) 编辑
摘要:题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。在单向链表中删除一个结点,最常规的做法无疑是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。这种思路由于需要顺序查找,时间复杂度自然就是O(n)。是不是一定需要得到被删除的结点的前一个结点呢?答案是否定的。 阅读全文
posted @ 2015-08-28 00:49 EdisonZhou 阅读(2421) 评论(2) 推荐(1) 编辑
摘要:题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。最容易想到的办法是先求出最大的n位数,然后用一个循环从1开始逐个打印。初看之下好像没有问题,但是其并没有考虑大数问题,有可能即使用整型(int)或长整型(long)都会溢出。 阅读全文
posted @ 2015-08-27 00:46 EdisonZhou 阅读(3935) 评论(0) 推荐(0) 编辑