July文章
gqtcgq
这个作者很懒,什么都没留下…
展开
-
01左旋字符串
题目描述: 定义字符串的左旋转操作:把字符串前面的k个字符移动到字符串的尾部。如把字符串abcdef左旋转k=2位得到字符串cdefab。请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。 大家开始可能会有这样的潜在假设,K尤其在编程的时候,全面地考虑问题是很重要的,K可能是一个远大于N的整数。转载 2015-05-14 17:50:51 · 481 阅读 · 0 评论 -
20杨氏矩阵查找
问题描述:在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字6,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。 解法 定位法,时间复杂度O(m转载 2015-06-12 08:51:39 · 435 阅读 · 0 评论 -
12胜者树和败者树
一:胜者树(http://www.haogongju.net/art/2266943) 问题描述:给出一个长度是N的数组,现在要找出最小的两个元素,最少要多少次比较。 分析: 如果找出1个最小的,比较次数无疑是n-1;如果用选择排序,再取选择第二个最小的又得比较n-2次。这种寻找的办法其实是可以优化的,在第一次寻找最小元素过程中,其实我们已经比较了很多元素了,那转载 2015-06-11 15:28:38 · 3165 阅读 · 1 评论 -
05快速排序
快速排序是实践中已知的最快的排序算法,他的平均运行时间为O(n logn), 最坏情形的性能为O(n^2)。 一:选取枢纽元的几种方法 1:糟糕的方法:通常的做法是选择数组中第一个元素作为枢纽元,如果输入是随机的,那么这是可以接受的。但是,如果输入序列是预排序的或者是反序的,那么依据这样的枢纽元进行划分则会出现相当糟糕的情况,因为可能所有的元素不是被划入S1,就是都被划入转载 2015-06-09 17:41:46 · 473 阅读 · 0 评论 -
06多次查询某区间内topk问题
题目描述:给定一个数组,需要多次查找不同区间内的,第k大或者第k小的元素。 考虑题目是多次查找,如果采用只对查询区间内的元素进行排序的思路,然后输出第k大的数的策略,那么下一次进行查询时,还需要对另外一个区间进行排序,再次查找。而且,如果两次查询的区间有重叠区域的话,第一次排序时已经破坏了数组,使得第二次查询无法进行。 针对这种问题,思路之一是转载 2015-06-09 22:05:50 · 671 阅读 · 0 评论 -
13概率问题
题目描述:一个文件中含有多个元素,只能遍历一遍,要求等概率随机取出其中之一。 先讲一个例子,5个人抽5个签,只有一个签意味着“中签”,轮流抽签,那么这种情况,每个人中签的概率分别是多大呢? 第一个人中签的概率是1/5, 第二个人中签的情况只能在第一个人未中时才有可能,所以他中的概率是4/5 * 1/4 = 1/5(4/5表示第一个人未中,1/4表示在剩下的4个签转载 2015-06-11 15:41:19 · 2904 阅读 · 0 评论 -
18数组中出现次数超过一半的数
题目描述:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。(出自编程之美) 分析:一个数组中有很多数,现在我们要找出这个数组中那个超过出现次数一半的数字,怎么找呢? 大凡当我们碰到某一个杂乱无序的东西时,考虑是否能够通过排序来解决问题: 如果数组无序,可以先把数组中所有这些数字先进行排序,至于选取什么排序方法则不在话下,最常用的快速排序O(N转载 2015-06-12 08:39:12 · 512 阅读 · 0 评论 -
21Hash算法以及暴雪Hash
一:哈希表简介 哈希表是一种查找效率极高的数据结构,理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值(key),然后在常量时间内定位到一个桶(术语bucket,表示哈希表中的一个位置)。当然这是理想情况下,因为任何哈希表的长度都是有限的,所以一定存在不同的数据项具有相同哈希值的情况,此时不同数据项被定为到同一个桶,称转载 2015-06-12 09:08:03 · 3672 阅读 · 0 评论 -
24字符串最短编辑距离
题目描述:给定一个源串和目标串,能够对源串进行如下操作: 1.在给定位置上插入一个字符 2.替换任意字符 3.删除任意字符 写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。 提醒:上文前言中已经说过了,此题反复出现,最近考的最多的是百度和Google的笔试面试经常考察。 分析:转载 2015-06-12 09:41:20 · 752 阅读 · 0 评论 -
19最短摘要问题
问题描述:给定一段产品的英文描述,包含N个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定M个英文单词关键字,请说明思路并编程实现方法extractSummary,目标是找出此产品描述中包含M个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。 编程之美有最短摘要生成的问题,与此问题类似。下面介绍这种方法。首先,可以在百度或谷歌中搜索本博客名称的前4转载 2015-06-12 08:49:59 · 750 阅读 · 0 评论 -
25最小操作数问题
题目描述: 给定一个单词集合Dict,其中每个单词的长度都相同。现从此单词集合Dict中抽取两个单词A、B。希望通过若干次操作把单词A变成单词B,每次操作可以改变单词的一个字母,同时,每次操作后,新产生的单词必须是在给定的单词集合Dict中。求所有行得通步数最少的修改方法。 举个例子如下:Given: A ="hit" B ="cog" Dict =[转载 2015-06-12 10:09:31 · 1439 阅读 · 0 评论 -
23最大乘积子串
题目描述:给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8。也就是说,上述数组中,3 0.5 8这3个数的乘积3*0.5*8=12是最大的,而且是连续的。 提醒:子串子序列不同,子串要求连续,子序列不要求连续。 分析:这个问题与“最大子数组”问题极为相似,最大子数组是求和的最大子串,该题是求积转载 2015-06-12 09:32:19 · 542 阅读 · 0 评论 -
07库函数编写
1:字符串查找 给定一个字符串A,要求在A中查找一个子串B。如A="ABCDF",要你在A中查找子串B=“CD”。 初步代码如下:int strstr(char *string, char *substring) { if (string == NULL|| substring == NULL)转载 2015-06-11 08:24:23 · 562 阅读 · 0 评论 -
15回文相关问题
回文指一个顺着读和反过来读都一样的字符串,比如 madam、我爱我。回文判断是一类典型的问题,尤其是与字符串结合后呈现出多姿多彩。 一、回文判断 如何判断一个字串是否是回文,最直接的方法显然是将字符串逆转,存入另外一个字符串,然后比较原字符串和逆转后的字符串是否一样,一样就是回文,这个方法的时空复杂度都是 O(n)。 很容易想到只要从两头开始同时向中间扫描字串,如果直到转载 2015-06-11 16:04:02 · 521 阅读 · 0 评论 -
02字符串包含及相关问题
题目描述: 假设这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出所有小字符串B里的字母在大字符串A里都有? 比如,如果是下面两个字符串:String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPO 答案是true,所有在string2里的字母string1转载 2015-06-09 09:56:22 · 505 阅读 · 0 评论 -
09求500万以内的亲合数
题目描述:求500万以内的亲合数 一:亲合数概念 如果两个数a和b, a的所有真因子之和等于b,b的所有真因子之和等于a,则称a,b是一对亲和数。 例如220和284:220的真因子是:1、2、4、5、10、11、20、22、44、55、110;284的真因子是:1、2、4、71、142。 以sum[i]表示i的所有真因子转载 2015-06-11 10:54:43 · 1856 阅读 · 0 评论 -
10链表追赶问题
一:求链表倒数第k个结点 题目描述:输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针(NULL)。 思路:设置两个指针p1,p2,首先p1和p2都指向head,然后p2向前走k步,这样p1和p2之间就间隔k个节点,最后p1和p2同时向前移动,直至p2走到链表末尾。 代码: ListNode* fun(ListNode转载 2015-06-11 11:06:43 · 588 阅读 · 0 评论 -
11如何给1千万个数据量的磁盘文件排序
问题描述:输入:给定一个文件,里面含有多个不重复的正整数,其中每个数都小于等于n,并且正整数的总个数小于n,n=10^7。输出:得到按从小到大升序排列的包含所有输入的整数的列表。条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间在5分钟以下,10秒为最佳结果。 一:位图法 因为所有整数均不重复,所以,考虑位图法。位图法就是当且仅当整数i在文件中存在时转载 2015-06-11 14:56:12 · 1049 阅读 · 0 评论 -
14海量日志提取出现次数最多的IP
问题描述:现有某网站海量日志数据,提取出某日访问该网站次数最多的那个IP。 分析:IP地址是32位的二进制数,所以共有N=2^32=4G个不同的IP地址, 如果将每个IP地址看做是数组的索引的话,那么需要创建一个unsigned count[N]的数组,即可统计出每个IP的访问次数,但是这个数组的大小是4G*4=16G, 远远超过了32位计算机所支持的内存大小,因此不能直接创建转载 2015-06-11 15:58:11 · 1067 阅读 · 0 评论 -
17一致性哈希算法
问题描述:假如QQ有n个服务器,为了方便用户的访问会在服务器上缓存据,因此用户每次访问的时候最好能保持同一台服务器。现有的做法是根据[QQNUM%n]得到请求的服务器,这种方法很方便将用户分到不同的服务器上去。 但是如果一台服务器死掉了,那么n就变为了n-1,那么[QQNUM%n]与[QQNUM%(n-1)]基本上都不一样了,所以大多数用户的请求都会转到其他服务器,这样会发生大量访转载 2015-06-12 08:01:34 · 470 阅读 · 0 评论 -
08查找满足条件的n个数
第一节、寻找和为定值的两个数 题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。 思路如下: 1:直接穷举,从数组中任意选取两个数,判定转载 2015-06-11 10:26:12 · 852 阅读 · 0 评论 -
16全排列以及跳台阶问题
一:全排列问题 题目:输入一个字符串,打印出该字符串中字符的所有排列。 例如输入字符串abc,则输出由字符a、b、c 所能排列出来的所有字符串:abc、acb、bac、bca、cab 和cba。 1:递归算法 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列。 代码:vo转载 2015-06-11 16:38:59 · 670 阅读 · 0 评论