Algorithm
文章平均质量分 50
wangicter
金融产品研发
展开
-
经典算法研究系列:七、深入浅出遗传算法,透析GA本质【转载】
遗传算法原创 2011-01-18 15:46:00 · 1772 阅读 · 1 评论 -
一个字符串中包含另一个字符串所有字符的最短子串长度?——《编程之美》最短摘要的生成的简化
题目:给定一个字符串及一个字符串集合A,求该字符串中包含A中所有字符的最短子串长度。 解决方案一:最直接的方法就是,直接开始遍历:查找任意两个子串之间是否包含str2,如果包含,记录下长度,求得最小值即可。str1 = "daebfacba";str2 = "abc";minLen = len(str1);for i = 0:len(str1) for j原创 2012-08-25 15:32:55 · 6851 阅读 · 1 评论 -
判断一个图是否有环(有向图,无向图)
无向图:法1:如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。 n算法: 中 第一步:删除所有度 第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。 如果最后还有未删除顶点,则存在环,否则没有环。 n算法分析: 由于有m条边,n个顶点。如果m>=n,则根据图论转载 2012-08-27 23:11:35 · 2583 阅读 · 0 评论 -
【程序员面试宝典】递归之两个字符串连接次序问题(P83)
题目:输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序。即输出125、126、145、146. 解决方案:此处仅考虑第一个字符串中的字符在第二个字符串中的相对位置不变的情况。此时,可以按照递归的思路思考如下:(1)递归过程中:采用两个指针分别指向两个字符串,对应字符相同,则同时后移,然后继续递归查找后面的相同的字符;(2)边界:原创 2012-08-28 22:09:34 · 1625 阅读 · 0 评论 -
如何查找完全二叉树最后一层的最右边的结点
题目:如何查找完全二叉树最后一层的最右边的结点。 解决方案:需要分两种情况考虑。(1)如果完全二叉树是用数组表示的,则直接取数组的最后一个元素。(2)如果完全二叉树是用指针表示的:可以如下解决:a. 从根节点开始,如果右子树存在,则每次先遍历右子树,如果右子树不存在,则访问左子树;b. 如果右子树是叶子节点(即当前节点没有孩子节点),则该节点即所求节点;如果原创 2012-08-28 22:36:38 · 3435 阅读 · 0 评论 -
利用动态规划求连续数组最大和以及最大子矩阵的和
题目一:给定一个整型数组,数组中有正有负,求最大连续子序列的和。 解法:利用动态规划的思想。设f(n)表示以a[n]为子序列最后一个元素的最大和,则可以有下面的规则:(1)当f(n-1)(2)当n!=0且f(n-1)>0时,f(n)=f(n-1)+a[n]。用一个nGreatestNum来记录最大值,每次与f(n)进行比较,不断更新即可。 题目二:给定一原创 2012-09-08 16:07:43 · 3930 阅读 · 0 评论 -
查找兄弟单词
问题:给定一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词,例如单词army和mary互为兄弟单词。现在给定一个字典,用户输入一个单词,如何根据字典找出这个单词有哪些兄弟单词?要求时间和空间效率尽可能的高。 解法一:使用hash_map和链表。 首先定义一个key,使得兄弟单词有相同的key,不是兄弟的单词有不同的key。例如,将单词按字母转载 2012-09-16 19:46:29 · 7874 阅读 · 2 评论 -
面经
1. 判断两节点是否是祖先和后代的关系;思路一:生成父指针,从孩子节点向上寻找,o(n);要求继续优化,可以采用跳表的方式来实现,这里涉及了一个孩子节点和祖先节点的层数问题,例如,输入两节点的层数差,直接利用跳表就很容易到达。思路二:利用深度优先遍历的思想。2. 沿着地球表面走,先向南一公里,再向东一公里,再向北走一公里,回到原点,问地球表面有哪些满足这种情况的点?3. 一个n位数原创 2012-09-14 19:09:39 · 958 阅读 · 2 评论 -
数组的连续子数组最大和(首尾相连)
题目:求一个循环数组的连续子数组的最大和。解法:《编程之美》上给出一种方法:1)求[0, n-1]的最大和;2)如果跨过了n-1,则计算以n-1为尾部的最大子数组[i, n-1],以0为开始的最大子数组[0 , j];如果i否则,M= a[0]+...+a[j] + a[i]+...a[n-1].该方法有问题:例如,1 7 -3 6 2以2结束的为全串,以1原创 2012-10-20 23:42:52 · 1926 阅读 · 0 评论 -
《编程之美》蚂蚁爬杆问题的扩展【1】
有一根长为L的平行于x轴的细木杆,其左端点的x坐标为0(故右端点的x坐标为L)。刚开始时,上面有N只蚂蚁,第i(1≤i≤N)只蚂蚁的横坐标为xi(假设xi已经按照递增顺序排列),方向为di(0表示向左,1表示向右),每个蚂蚁都以速度v向前走,当任意两只蚂蚁碰头时,它们会同时调头朝相反方向走,速度不变。编写程序求所有蚂蚁都离开木杆需要多长时间。该问题是经典问题了,有O(N)的解法。昨天和赵牛同学原创 2012-10-20 22:03:25 · 4108 阅读 · 1 评论 -
如何将一棵树转换成二叉树
题目:如何将一棵树转换成二叉树? 解答:1. 将 节点的孩子 放在左子树;2. 将 节点的兄弟 放在右子树。 延伸:任何一棵树都可以表示成二叉树,并不是任何一棵二叉树都可以表示成树。那么树多还是二叉树多? 1. 任何一棵树都可以表示成二叉树,结合以上题目很容易理解。2.不是任何一棵二叉树都可以表示成树:当根节点包含右子树的时候,就无法表示成树了。原创 2012-09-29 14:34:26 · 14531 阅读 · 5 评论 -
Google面试题——蓄水问题
问题:有一块矩形土地被划分成 N×M 个正方形小块,每块是一平方米。这些小块高低不平,每一小块地都有自己的高度H(i, j)米。水可以由任意一块地流向周围四个方向的四块地中,但不能直接流入对角相连的小块中。一场大雨后,许多低洼地方都积存了不少降水,求出它最多能积存多少立方米的降水么?思路:先看一维的情况如何处理:预处理: 对每个格子求左边和右边的最高高度。 遍历每个格子: 找到左右原创 2012-12-11 16:23:11 · 2174 阅读 · 0 评论 -
股市买入卖出时间点选择问题
题目:给你一个股价序列,告诉你每个时间点的股价,问你什么时候买什么时候卖获利最大。时间复杂度越低越好。 解答:方法一:只需要从左往右遍历一遍序列Sequence[N],获得每一个元素对应的左边的最小值即可。例如,设为min[N]。再次遍历序列时,通过计算Sequence[i] - min[i],并获得最大值即可。当然,本题还要求给出买入卖出位置,因此可以再加入一个loc原创 2012-12-11 16:30:32 · 2815 阅读 · 0 评论 -
字符串匹配算法总结
KMP虽然经典,但是理解起来极其复杂,好不容易理解好了,便起码来巨麻烦!其实,比KMP算法速度快的算法大把大把,而且理解起来更简单,为何非要抓住KMP呢?笔试出现字符串模式匹配时直接上sunday算法,既简单又高效,何乐而不为?说实话,想到sunday算法的那个人,绝对是发散思维,绝对牛。当我在被KMP折磨的够呛的时候,我就琢磨,有没有别的好算法呢??琢磨了半天也没想出个所以然来。笨啊转载 2012-12-13 10:02:12 · 1295 阅读 · 0 评论 -
腾讯面试题
一,设计一个魔方(六面)的程序。 P194 思路:魔方总数9 + 9 + 8 = 26 魔方有六个面,需要定义六个结构体,内容为一个9个点和一个编号,其中每个点包含一个颜色标识;在魔方展开图中根据正方形的相邻关系编号,每个正方形都有四个函数:左翻、右翻、上翻、下翻 根据相邻关系,每个操原创 2012-08-24 23:41:14 · 1180 阅读 · 0 评论 -
求一个有序整数数组中和为K的数的对数
题目:求一个有序整数数组中和为K的数的对数。解决方案:两个指针,一个在头,一个在尾;大则-,小则加。 延伸题目:(1)求整数数组中和为K的对数。先排序,O(N*logN),在按照以上算法查找O(N)。(2)求一个整数数组差为K的数的对数。先排序,O(N*logN),然后,用两个指针均从头部开始,一个先走一个后走,差过小则前指针++,差过大则后指针++。这原创 2012-09-03 18:32:32 · 2638 阅读 · 2 评论 -
随机概率发生器
题目:已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它构造0和1的概率均为1/2解决方案:这是随机概率发生器的典型题目。由于需要产生1/2,而用1位0,或1位1无法产生等概率,因此,考虑将随机数扩展成2位:00 p*p01 p*(1-p)10 (1-p)*p11 (1-p)*(1-p)有上述分析知道,01和10原创 2012-08-24 09:52:49 · 6486 阅读 · 3 评论 -
java中多叉树(tree)的生成与显示
先看看多叉树的表示吧。一. 多叉树的表示: 由于要表示多个孩子,不能像二叉树那样一个leftchild,一个rightchild。当然你也可以选择采用孩子兄弟表示法来将多叉树转化成二叉树。但java提供了链表功能,能够允许设置不定数目的孩子,极大方便了多叉树的表示和原创 2011-09-15 11:57:32 · 15653 阅读 · 0 评论 -
最小生成树与最短路径的区别以及实现方法
一 区别最小生成树能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。最短路径是从一点出发,到达目的地的路径最小。二 实现方法1. 最小生成树最小生成树有两种算法来得到:Prims算法和Kruskal算法。Kruskal算法:根据边的加权值以递增的方式,一次找出加权值最低的边来构建最小生成树,而且规定:每次添加的边不能造成生成树有回路,知道找到N-1个边原创 2011-11-18 20:55:15 · 21993 阅读 · 0 评论 -
x&(x-1)表达式的意义
求下面函数的返回值(微软) -- 统计1的个数-------------------------------------int func(int x){int countx = 0;while(x){countx++;x = x&(x-1);}return countx;} 假定x = 999910011100001111答案: 8原创 2012-02-15 21:16:55 · 683 阅读 · 0 评论 -
一摞烙饼的问题
问题: 星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯。程序员多喝了几杯之后谈什么呢?自然是算法问题。有个同事说:“我以前在餐馆打工,顾客经常点非常多的烙饼。店里的饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好——小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就排好序了。我后原创 2012-04-11 10:33:56 · 1173 阅读 · 0 评论 -
腾讯笔试:把两个数和告诉A,积告诉B,求这两个数是什么
题目:1-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少?分析:设和为S,积为M。首先,A:我不知道。说明:S可以分解成多个组合,而2=1+1,3=1+2,40=20+20,39=19+20,只有一种分解方式,因此S应属于[4,38]集合。其次,B:我也不知道。说明:M也可以分原创 2012-04-12 11:33:36 · 19129 阅读 · 11 评论 -
蓄水池抽样
如何等概率的从N个元素中选取出K个元素?这个问题就是一个蓄水池抽样(Reservoir Sampling),算法可以如下描述: Init : a reservoir with the size: k for i= k+1 to N M=random(1转载 2012-06-18 19:32:39 · 680 阅读 · 0 评论 -
平均要取多少个(0,1)中的随机数才能让和超过1
数学常数最令人着迷的就是,它们常常出现在一些看似与之毫不相干的场合中。 随便取一个 0 到 1 之间的数,再加上另一个 0 到 1 之间的随机数,然后再加上一个 0 到 1 之间的随机数⋯⋯直到和超过 1 为止。一个有趣的问题:平均需要加多少次,才能让和超过 1 呢?答案是 e 次。#define NUM 9999999 int main(){ int sum=0;srand(原创 2012-08-15 13:23:12 · 4080 阅读 · 7 评论 -
人搜面试摘录
一、面试形式 1、3轮1V1的技术面试;某轮面试通过,稍事休息后开始下一轮面试。 2、面试过程基本分为两部分: 1)对简历上所写项目的描述,及回答对方感兴趣的项目细节; 2)对方给出数组、链表等常见程序设计问题,要求描述解决问题的思路;并把思路转化为代码(手写)。 这一部分是最重要的环节,占面原创 2012-08-16 22:12:15 · 2577 阅读 · 5 评论 -
人搜笔试题目
1. 快排每次以第一个作为主元,问时间复杂度是多少?(O(N*logN))2. T(N) = N + T(N/2)+T(2N), 问T(N)的时间复杂度是多少?(O(N))3. 从(0,1)中平均随机出几次才能使得和超过1?(e)4.编程题: 一棵树的节点定义格式如下: struct Node{Node* parent;Node* firstChild; // 孩子节点原创 2012-08-16 22:08:01 · 2768 阅读 · 3 评论 -
将多个集合合并成没有交集的集合
百度面试题:将多个集合合并成没有交集的集合2010-03-20 18:25给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。(1)请描述你解决这个问原创 2012-08-30 23:32:09 · 8479 阅读 · 3 评论 -
如何判断两个矩形相交
假定矩形是用一对点表达的(minx, miny) (maxx, maxy),那么两个矩形 rect1{(minx1, miny1)(maxx1, maxy1)} rect2{(minx2, miny2)(maxx2, maxy2)} 相交的结果一定是个矩形,构成这个相交矩形rect{(minx, miny) (maxx, maxy)}的点对坐标是: minx转载 2012-08-30 22:54:34 · 5284 阅读 · 0 评论 -
《算法导论》之 Problem 5.1-3(随机函数发生器的设计)
问题叙述:*5.1-3 假设你希望以各1/2的概率输出0和1.你可以自由使用一个输出0或1的过程BIASED-RANDOM。它以概率p输出1,以概率1 - p输出0,其中 0 算法分析: 已知BIASED-RANDOM可产生0和1,那么 1 - BIASED-RANDOM也产生1和0,且以1 - p的概率输出1,以p的概率输出0。 如果我们将1 - BIAS转载 2012-08-24 00:20:46 · 2547 阅读 · 0 评论 -
计算点在哪些四边形内
题目:一个平面中,有很多正四边形,大小不一,任意四边形之间可以有重叠部分,如下图所示现在有2000个点,如何快速定位这些点分别属于哪些四边形区域? 解决方案:采用区域分割+hash查找的方法。1. 预处理阶段:X将四边形按照左边进行排序,然后逐一按照X轴划分区域,如图:然后,将每一个区域的左边界和右边界作为key,所包含的四边形作为value,存入哈希表中。原创 2012-08-24 10:24:34 · 1282 阅读 · 0 评论 -
如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
题目:写一个函数判断一个int类型的数组是否是有效的。 所谓有效是指:假设数组大小为n,那么这个int数组里的值为0~n-1之间的数,并且每个数只能出现一次,否则就是无效数组。 例如[5,3,1,4,2,0]是有效的,[5,3,5,1,2,0]是无效的,[5,3,6,1,2,0]是无效的。 解法思路一:置换的思想用一个temp来存储被置换出来的值,例如数组a:5原创 2012-08-23 17:56:40 · 8001 阅读 · 15 评论