
数据结构/算法
文章平均质量分 68
yuucyf
这个作者很懒,什么都没留下…
展开
-
红黑树(Red Black Tree)
<br />介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf Bayer于1972年发明,当时被称为平衡二叉B树(symmetric binary B-trees),1978年被Leonidas J. Guibas 和 Robert Sedgewick改成一个比较摩登的名字:红黑树。<br />红黑树和之前所讲的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的转载 2010-08-18 14:16:00 · 1389 阅读 · 0 评论 -
每天学习一算法系列(28)(输入一个整数n,求从1 到n 这n 个整数的十进制表示中1 出现的次数)
题目:输入一个整数n,求从1 到n 这n 个整数的十进制表示中1 出现的次数。例如输入12,从1 到12 这些整数中包含1 的数字有1,10,11 和12,1 一共出现了5 次。注:这是一道广为流传的google 面试题。 思路一:我们每次判断整数的个位数字是不是1。如果这个数字大于10,除以10 之后再判断个位数字是不是1。(对每一个数x,x先与10取余,然后判断x/10原创 2011-08-18 15:05:07 · 6108 阅读 · 1 评论 -
每天学习一算法系列(27)(输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序)
题目:输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序。为了简单起见,我们假设push 序列的任意两个整数都是不相等的。比如输入的push 序列是1、2、3、4、5,那么4、5、3、2、1 就有可能是一个pop 系列,但序列4、3、5、1、2 就不可能是push 序列1、2、3、4、5 的pop 序列。 思路一:对Pop系列原创 2011-08-17 14:29:09 · 2770 阅读 · 0 评论 -
每天学习一算法系列(25)(一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。)
题目:一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。注:这道题最近经常出现,包括MicroStrategy 等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。 思路一:首先我们考虑最简单的情况:如果只有1 级台阶,那显然只有一种跳法,如果有2 级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1 级;原创 2011-08-16 14:51:23 · 10122 阅读 · 2 评论 -
每天学习一算法系列(23)(写一个程序,要求功能,求出用1、2、5这三个数不同个数组合的和为100的组合数)
题目:写一个程序,要求功能,求出用1、2、5这三个数不同个数组合的和为100的组合数。如100个1是一个组合,20个5是另外一个组合。 思路一:看到这样的问题我们首先会想到最简单穷举法,三层循环就可以解决了。 代码如下:/*=============================Copyright by yuucyf. 2011.08.11========原创 2011-08-11 15:50:20 · 7313 阅读 · 2 评论 -
每天学习一算法系列(22)(在字符串中找出连续最长的数字串,并把这个串的长度返回)
题目:写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr 所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr 后,函数将返回9,outputstr 所指原创 2011-08-10 17:36:10 · 3208 阅读 · 0 评论 -
每天学习一算法系列(18)(n 个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m 个数字)
题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,每次从这个圆圈中删除第m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字), 当一个数字删除后,从被删除数字的下一个继续删除第m 个数字。求出在这个圆圈中剩下的最后一个数字。该题目是以下题目的变形。(n 个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下原创 2011-07-21 17:28:06 · 3458 阅读 · 0 评论 -
每天学习一算法系列(16)(输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印)
题目:(微软)输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入: 8 / \ 6 10 / \ / \5 7 9 11输出:8 6 10 5 7 9 11. 思路一:这道题目其实就是二叉树的层次遍历的问题,借用队列来解。具体思路是:从根节点开始,先把根节点入队列,然后一直往队列取出节点,并访问节原创 2011-07-20 16:53:19 · 2964 阅读 · 0 评论 -
每天学习一算法系列(9) (输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果)
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果,如果是返回true,否则返回false。例如:输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / / 6 10 / / / /5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false原创 2011-05-04 17:58:00 · 4678 阅读 · 3 评论 -
每天学习一算法系列(6) (输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径)
题目:输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径。例如:输入整数22和如下二元树 10 / / 5 12 / / 4 7 /3 则打印出三条路径:10, 12和10, 5, 7和10, 5, 4, 3。题目来源于:http://topic原创 2011-04-27 11:37:00 · 4465 阅读 · 0 评论 -
每天学习一算法系列(30)(给一个很长的字符串str 还有一个字符集比如{a,b,c} 找出str 里包含{a,b,c}的最短子串。要求O(n).)
题目:给一个很长的字符串str 还有一个字符集比如{a,b,c} 找出str 里包含{a,b,c}的最短子串。要求O(n).比如,字符集是a,b,c,字符串是abdcaabcx,则最短子串为abc。 思路一:用两个变量Front, Rear 指向这个字串(str)区间的头和尾,开始的时候同指向字符串首地址,用一个变量int achSubCnt[256]={0}记录字符集a,b,原创 2011-08-24 11:21:32 · 4059 阅读 · 1 评论 -
每天学习一算法系列(29)(有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小)
题目:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小。例如:var a = [100,99,98,1,2, 3];var b = [1, 2, 3, 4,5,40];最后的结果为:var a = [1,99,98,1,2,2]; var b = [100, 3,3,4,5原创 2011-08-19 12:09:02 · 10087 阅读 · 6 评论 -
每天学习一算法系列(26)(输入一个整数,求该整数的二进制表达中有多少个1)
题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 思路一:这是一道很基本的考查位运算的面试题。一个很基本的想法是,我们先判断整数的最右边一位是不是1,接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0 为止。现在的问题变成怎样判断一个整数的原创 2011-08-16 15:36:42 · 2119 阅读 · 0 评论 -
每天学习一算法系列(5)(已知两个数组,数组里的元素有正有负,但是都是按照从小到大已经排好序,要求用尽可能小的时间复杂度编写一算法求出两个数组的最大交集)
昨天刚刚去迅雷面试,总体感觉还不错,不过有的填空题目做错的太冤枉了,也都怪平时养成马虎的习惯,以后一定要改掉这样的毛病,总体来说题目质量还是不错的,有选择题,填空题,简答题,算法题,主要考C++对象模型的知识比较多,还零星的考一些COM相关题目,至于算法题还蛮简单的,有两道,第一道是反转链表,另外一道就是我这篇文章所要讲的题目。 题目:已知两个数组,数组里的元素有正有负,但是都是按照从小到原创 2011-04-26 18:11:00 · 3621 阅读 · 3 评论 -
每天学习一算法系列(1)(定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部)
这几天一直在看了July写了【横空出世,席卷互联网 [评微软等公司数据结构+算法面试100题】,里面的好多算法都很不错,所以决定把看过掌握地并亲自试验一遍没有问题后再写到自己的博客中,当然算法的思想及实现都会注明来自何方。文章来自:http://blog.youkuaiyun.com/v_JULY_v/archive/2011/04/14/6322882.aspx算法一:左旋转字符串题目描述:原创 2011-04-20 16:24:00 · 4695 阅读 · 2 评论 -
每天学习一算法系列(31)(实现一个队列,队列的应用场景为:一个生产者线程将int 类型的数入列,一个消费者线程将int 类型的数出列)
题目:实现一个队列。队列的应用场景为:一个生产者线程将int 类型的数入列,一个消费者线程将int 类型的数出列。 思路一:这就是操作系统中介绍的PV操作,队列的一个典型的应用模式。实现这个PV操作的过程中要注意两个线程之间的通信就可以了。 代码如下:/*-----------------------------Copyright by yuucyf. 2011原创 2011-08-25 09:26:38 · 3912 阅读 · 0 评论 -
每天学习一算法系列(33)(n 支队伍比赛,分别编号为0,1,2......n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强)
题目:n 支队伍比赛,分别编号为0,1,2......n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j 的队伍中更强的一支,所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是4 对3, 5 对8。然胜者晋级,败者淘汰,原创 2011-08-30 17:32:20 · 5968 阅读 · 3 评论 -
每天学习一算法系列(15)(输入一颗二元查找树,将该树转换为它的镜像)
题目: 输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入:8/ \6 10/\ /\5 7 9 11输出:8/ \10 6/\ /\11 9 7 5定义二元查找树的结点为:struct BSTreeNode // a node in th原创 2011-07-20 11:25:21 · 1704 阅读 · 0 评论 -
每天学习一算法系列(3)(设计包含min函数的栈,要求函数min、push以及pop的时间复杂度都是O(1))
题目:请设计包含min函数的栈。定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。题目来源于:http://topic.youkuaiyun.com/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html思路:按照题目所给出的要求,我们开始想到的是设计一原创 2011-04-21 16:07:00 · 3952 阅读 · 3 评论 -
每天学习一算法系列(32)(求一个矩阵中最大的二维矩阵(元素和最大))
题目:求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的二维矩阵是:4 55 3 要求:(1)写出算法;(2)分析时间复杂度;(3)用C 写出关键代码. 思路一:这个题目要求出最大的二维矩阵,我们首先想到的一个解法就是:从行1到行N进行遍历,以二维矩阵为单元进行遍历,也就说(行x列x -- 行x+原创 2011-08-25 11:31:32 · 4571 阅读 · 0 评论 -
每天学习一算法系列(24)(实现字符串左旋转的函数)
题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef 左旋转2 位得到字符串cdefab。请实现字符串左旋转的函数,要求时间对长度为n 的字符串操作的复杂度为O(n),辅助内存为O(1)。 思路一:分析:如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置。于是我原创 2011-08-15 11:35:33 · 1488 阅读 · 0 评论 -
每天学习一算法系列(19)(输入n,用最快的方法求该数列的第n 项)
题目:定义Fibonacci 数列如下:f(n) = 0 (n=0)f(n) = 1 (n=1, 2)f(n) = f(n-1)+f(n-2) (n>2)输入n,用最快的方法求该数列的第n 项。思路一:我相信很多程序员看到这道题都很容易想到用递归的方法解这个问题,但是,你知道的,这并不是最快的方法。还有一种方法就是用一个For(While)循环来遍历同样可原创 2011-07-22 11:30:22 · 3518 阅读 · 0 评论 -
每天学习一算法系列(17)(在一个字符串中找到第一个只出现一次的字符)
题目:在一个字符串中找到第一个只出现一次的字符,如输入abaccdeff,则输出b.(这道题是2006 年google 的一道笔试题) 思路一:由于题目与字符出现的次数相关,我们可以统计每个字符在该字符串中出现的次数,要达到这样的目的的话那么我们可以利用Hash表来解这样的问题,用一个可以容纳所有的char的数组来作为容器,把相应的字符所对应的ASCLL码值作为下表进行映射,这原创 2011-07-21 11:24:24 · 1255 阅读 · 0 评论 -
每天学习一算法系列(14) (输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字)
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如:输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。 思路一:题目要求时间复杂度为O(n),那么就只有一次遍历数组就得找出结果。集体做法是这样:开始从数原创 2011-05-09 22:57:00 · 2314 阅读 · 0 评论 -
每天学习一算法系列(13) (输入一个单向链表,输出该链表中倒数第k个结点)
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext;};题目来源于:http://topic.youkuaiyun.com/u/20101011/16/2befbfd9-f3e4-41c5-bb31-814e9615832e.原创 2011-05-08 17:18:00 · 3147 阅读 · 2 评论 -
每天学习一算法系列(11) (求二叉树中节点的最大距离)
题目:求二叉树中节点的最大距离.如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。 题目来源于:http://topic.youkuaiyun.com/u/20101011/16/2befbfd9-f3e4-41c5-bb31-814e9615832e.html 思路一:题目原创 2011-05-06 15:52:00 · 2020 阅读 · 2 评论 -
每天学习一算法系列(10)(输入一句英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以空格符隔开)
题目:输入一句英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如:输入“I am a boy.”,则输出“boy. a am I”。 题目来源于:http://topic.youkuaiyun.com/u/20101011/16/2befbfd9-f3e4-41c5-bb31-814e9615832e.html原创 2011-05-05 17:37:00 · 4698 阅读 · 0 评论 -
每天学习一算法系列(7) (根据上排给出十个数,在其下排填出对应的十个数)
题目:给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数要求下排每个数都是先前上排那十个数在下排出现的次数。上排的十个数如下:【0,1,2,3,4,5,6,7,8,9】举个例子,上排数值: 0,1,2,3,4,5,6,7,8,9下排数值: 6,2,1,0,0,0,1,0,0,00在下排出现了6次,1在下排出现了2次,2在下排出现了1次,3在下排出现了0次原创 2011-04-28 17:38:00 · 2699 阅读 · 1 评论 -
每天学习一算法系列(4) (输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和)
题目:输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。题目来源于:http://blog.youkuaiyun.com/v_JULY_v/原创 2011-04-22 18:23:00 · 12916 阅读 · 11 评论 -
每天学习一算法系列(2)(把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.)
题目:把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。题目来自:http://topic.youkuaiyun.com/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html 思路:一看到这样的问题首先想到的是二叉树的遍历问题,具体是前序原创 2011-04-21 12:32:00 · 4498 阅读 · 1 评论 -
每天学习一算法系列(35)(递归和非递归俩种方法实现二叉树的前序遍历)
题目:递归和非递归俩种方法实现二叉树的前序遍历。 思路一:对二叉树的递归遍历我相信大家只要学了数据结构后应当都很容易就能写出,这里主要是讨论二叉树的非递归写法。按照二叉树前序遍历的定义,无论是访问整棵树还是其子树,均应该遵循先访问根结点,然后访问根结点的左子树,最后访问根结点的右子树的。在整个二叉树前序遍历的过程中,程序始终要做的工作分成俩个部分:(借用辅助栈来实现)1. 当前原创 2011-09-06 10:34:58 · 2703 阅读 · 0 评论 -
每天学习一算法系列(34)(求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数)
题目:求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间杂度。 思路一:计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者。首先算原创 2011-09-02 11:27:09 · 7507 阅读 · 3 评论 -
每天学习一算法系列(8) (编程判断俩个链表是否相交)
题目:编程判断俩个链表是否相交,给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。 为了简化问题,我们假设俩个链表均不带环。 经典算法题精选" alt="编程之美|微软技术面试心得 经典算法题精选" src="http://s4.sinaimg.cn/middle/5e3ab00cx91eda230e523&690" width="280" height="107"原创 2011-05-03 18:05:00 · 1453 阅读 · 3 评论