随笔分类 -  算法类

[二叉树]二叉树两个结点的最低共同父结点
摘要:寻找路径的方法值得借鉴 阅读全文
posted @ 2011-10-08 15:23 dartagnan 阅读(697) 评论(0) 推荐(0)
[二叉树]把二元查找树转变成排序的双向链表
摘要:调整树的过程 阅读全文
posted @ 2011-10-08 11:24 dartagnan 阅读(1391) 评论(0) 推荐(0)
[数组]找出数组中两个只出现一次的数字
摘要:通过异或来操作 阅读全文
posted @ 2011-10-08 10:07 dartagnan 阅读(506) 评论(0) 推荐(0)
[数组]顺时针打印螺旋矩阵
摘要:顺时针打印螺旋矩阵 阅读全文
posted @ 2011-10-08 09:09 dartagnan 阅读(4519) 评论(1) 推荐(0)
[字符串]左旋转字符串
摘要:旋转字符串 阅读全文
posted @ 2011-10-07 22:12 dartagnan 阅读(299) 评论(0) 推荐(0)
[字符串]翻转句子中单词的顺序
摘要:翻转句子中单词的顺序 阅读全文
posted @ 2011-10-07 21:45 dartagnan 阅读(773) 评论(0) 推荐(0)
[字符串]在一个字符串中查找第一次只出现一次的字符
摘要:[字符串]在一个字符串中查找第一次只出现一次的字符 阅读全文
posted @ 2011-10-07 20:59 dartagnan 阅读(2304) 评论(0) 推荐(0)
[字符串]在字符串中删除特定的字符
摘要:[字符串]在字符串中删除特定的字符 阅读全文
posted @ 2011-10-07 20:45 dartagnan 阅读(491) 评论(0) 推荐(0)
[链表]从尾到头输出链表
摘要:[链表]从尾到头输出链表 阅读全文
posted @ 2011-10-07 19:56 dartagnan 阅读(347) 评论(0) 推荐(0)
[链表]在O(1)时间删除链表结点
摘要:[链表]在O(1)时间删除链表结点 阅读全文
posted @ 2011-10-07 19:47 dartagnan 阅读(364) 评论(0) 推荐(0)
[链表]复杂链表的复制
摘要:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。 阅读全文
posted @ 2011-10-07 17:22 dartagnan 阅读(339) 评论(0) 推荐(0)
[ 队列]从上往下遍历二元树
摘要:题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入8/ \6 10 /\ /\5 7 9 11输出8 6 10 5 7 9 11。分析:这曾是微软的一道面试题。这道题实质上是要求遍历一棵二元树,只不过不是我们熟悉的前序、中序或者后序遍历。我们从树的根结点开始分析。自然先应该打印根结点8,同时为了下次能够打印8的两个子结点,我们应该在遍历到8时把子结点6和10保存到一个数据容器中。现在数据容器中就有两个元素6 和10了。按照从左往右的要求,我们先取出6访问。打印6的同时要把6的两个子结点5和7放入数据容器中,此时数据容器中有三个元素10、5和7。接下来我 阅读全文
posted @ 2011-10-07 17:11 dartagnan 阅读(319) 评论(0) 推荐(0)
栈的push、pop序列
摘要:题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。分析:这到题除了考查对栈这一基本数据结构的理解,还能考查我们的分析能力。这 阅读全文
posted @ 2011-10-07 16:46 dartagnan 阅读(699) 评论(0) 推荐(0)
最长公共子串(LCS)
摘要:最长公共子串(LCS),有三种情况:1.公共子串的元素必须相邻. 2.公共子串的元素可以不相邻联单3. 求多个字符串而不是两个字符串的最长公共子串1.公共子串的元素必须相邻: LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置.下面是字符串21232523311324和字符串312123223445的匹配矩阵,前者为X方向的,后者为Y方向的。不难找到,红色部分是最长的匹配子串。通过查找位置我们得到最长的匹配子串为:21232 0 0 0 1. 阅读全文
posted @ 2011-10-06 09:48 dartagnan 阅读(26293) 评论(1) 推荐(12)
最长公共子序列
摘要:最长公共子序列与最长公共子串的区别在于最长公共子序列不要求在原字符串中是连续的,比如ADE和ABCDE的最长公共子序列是ADE。 我们用动态规划的方法来思考这个问题如是求解。首先要找到状态转移方程: 等号约定,C1是S1的最右侧字符,C2是S2的最右侧字符,S1‘是从S1中去除C1的部分,S2'是从S2中去除C2的部分。 LCS(S1,S2)等于下列3项的最大者: (1)LCS(S1,S2’) (... 阅读全文
posted @ 2011-10-06 09:37 dartagnan 阅读(563) 评论(0) 推荐(0)
最大子序列和问题
摘要:问题描述:输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:序列:-2 11 -4 13 -5 -2,则最大子序列和为20。序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。算法一://穷举法,复杂度O(n^3)long maxSubSum1(const vector<int>& a){long maxSum = 0;for (int i = 0; i < a.size(); i++){for (int j = i; j < a.size(); j++){long thi 阅读全文
posted @ 2011-10-05 20:26 dartagnan 阅读(257) 评论(0) 推荐(0)
TCP三次握手/四次挥手过程详解
摘要:TCP协议提供可靠的连接服务,采用三次握手建立一个连接。以下步骤概述了通常情况下客户端计算机请求与服务器计算机简历TCP的过程: TCP三次握手图解 TCP图解3次握手 1. 客户端向服务器发送一个SYN置位的TCP报文,其中包含连接的初始序列号x和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。 2. 服务器收到客户端发送过来的SYN报文后,向客户端发送一个SYN... 阅读全文
posted @ 2011-10-05 11:22 dartagnan 阅读(725) 评论(0) 推荐(1)
对正整数,算得到1需要操作的次数
摘要:题目:实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。例子:func(7) = 4,可以证明最少需要4次运算n = 7n-1 6n/2 3n-1 2n/2 1要求:实现函数(实现尽可能高效) int func(unsign int n);n为输入,返回最小的运算次数。给出思路(文字描述),完成代码,并分析你算法的时间复杂度。int func(unsign int n){ if (n == 1) { return 0; } if (n%2 == 0) { return 1 + func(n/2); }.. 阅读全文
posted @ 2011-09-30 22:02 dartagnan 阅读(549) 评论(1) 推荐(0)
判断两棵树是否相等
摘要:题目:请实现两棵树是否相等的比较,相等返回1,否则返回其他值,并说明算法复杂度。数据结构为:typedef struct_TreeNode{char c;TreeNode *leftchild;TreeNode *rightchild;}TreeNode;函数接口为:int CompTree(TreeNode* tree1,TreeNode* tree2);注:A、B两棵树相等当且仅当Root->c==RootB-->c,而且A和B的左右子树相等或者左右互换相等。更多方法请见:http://hi.baidu.com/mianshiti/blog/item/1070b78ce2ece 阅读全文
posted @ 2011-09-30 16:48 dartagnan 阅读(1919) 评论(0) 推荐(0)
从10G个数中找到中数
摘要:题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。不妨假设10G个整数是64bit的。2G内存可以存放256M个64bit整数。我们可以将64bit的整数空间平均分成256M个取值范围,用2G的内存对每个取值范围内出现整数个数进行统计。这样遍历一边10G整数后,我们便知道中数在那个范围内出现,以及这个范围内总共出现了多少个整数。如果中数所在范围出现的整数比较少,我们就可以对这个范围内的整数进行排序,找到中数。如果这个范围内出现的整数比较多,我们还可以采用同样的方法将此范围再次分成多个更小的范围(256M=2^28,所以最多需要3次就可以将此范围缩小到1,也就找到 阅读全文
posted @ 2011-09-30 16:35 dartagnan 阅读(522) 评论(0) 推荐(0)