这里是我在网上搜索到的面试的常见算法,归纳起来,是利人自私。
top k 问题:
选择第k个大小(前k个大小)的数量可以采用类似快速排序的方法,利用快速排序的思想,从数组s中随机找到元素x,将数组分为两个部分Sa和Sb。 Sa中的元素为x以上,Sb中的元素小于x。 在这种情况下,有两种情况。
1 .在sa中元素的个数小于k的情况下,Sb中的第k-|Sa|个元素为第k个数;
2 .如果Sa中的元素个数为k以上,则返回Sa中的第k个数。 时间复杂度几乎为o(n )
你可以用最大的方法。 pop k次就可以了。
海量数据的top k 问题:
例如,从1亿个(n )个中选择最大的10000(m个(m个)。 此时,根据情况进行研究。 如果内存不足,可以选择创建m个最小堆,遍历n个,如果大于堆顶部,则插入。
内存充足的情况下,可以直接采用快速排序法,将n个分为100份数,分别找到100个最大的10000个,最后从100万个中寻找10000个最大的,等等,利用分割统治法。
选取频率最高问题
海量数据的top k问题需要统计其中出现频率最高的100个1g大小的文件(如果有)。 有一个1g大小的文件,其中每行一个词,词大小不超过16字节,内存限制大小为1M。 返回度数最高的100个单词。
情景:依次读取文件,对每个单词x取hash(x ) P00,根据其值保存在5000个小文件(记为x0、x1、…x4999 )中。 这样,每个文件约200k左右。
如果其中有超过1M的文件,也可以继续向下划分,直到用同样的方法分解得到的小文件大小小于或等于1M。
针对每个小文档,针对每个文档统计出现单词及其对应的频率(可以使用trie树/hash_map等),取出出现频率最大的100个单词(可以使用包含100个节点的最小堆),与100个单词相对下一步是合并(相似和合并排序)这5000个文件的过程。
http://www.Sina.com /http://blog.csdn.net/Yangquan hui 1991/article/details/52172768
通常,首先将散列映射到不同的小文件,然后在散列映射中确定频率,最后合并
3358 www.Sina.com/: http://blog.csdn.net/zcsylj/article/details/6802062采取二分法的思考
有一个以此为N1的数组,无论如何检索第一个N2的大个数,数字都在0-10000之间。 可以按基数排序,时间复杂度为o(n )
1 .数组中的逆序对计算。 (剑指报价) ) ) )。
2 .判断一棵树是否是另一棵树的子树(剑指出价)。
3 .数据流要求o(1)中值,o (lgn )插入)剑指报价)
4 .顺时针打印矩阵(剑指关闭) )。
5 .复制复杂链表(剑指报价) () ) ) ) ) ) ) ) ) ) ) )。
6 .二叉排序树中第k小的数(剑指报价) ) ) ) ) ) ) ) )。
7 .反转链表递归、非递归(剑指关) ) ) ) ) ) ) ) )。
8 .链表倒数第k个节点(剑指offer ) )。
9 .排列一半以上的数字(剑指关)。
10 .左旋转字符串(剑指off ) )。
11 .将二叉树打印成多行(剑指关) )。
12 .旋转排列检索(剑指off ) ) ) )。
13 .链表的合并排序
14.trapping rainwater 3359 leet code.com/problems/trapping-rain-water /
15.longestpalindromicsubstring 3359 leet code.com/problems/longest-palindromic-substring /
16.gray code https://leet code.com/problems/gray-code /
17.binarytreemaximumpathsum https://leet code.com/problems/binary-tree-maximum-path-sum /
18.searchforarange https://leet code.com/problems/search-for-a-range /
19 .算术表达式为逆波兰表达式(后缀表示) () ) () ) ) ) ) ) ) ) ) 652 ) ) ) ) ) ) ) ) )
20 .中小学教师
21 .字符串由大小写组成,需要加重,只能使用一些int临时变量,需要尽量减少时间复杂度
22 .青蛙每次跳楼梯,每跳一步或两步,青蛙总共可以跳n次。 楼梯共有m级(n=m ),每级有几种害虫,是青蛙吃得最多的害虫。
23 .移除由左括号和右括号组成的字符串,至少使其馀字符串合法(遵循左括号规则) )。
24.5实现选三
25 .要求从阵列中的后面数减去前面数之差的最大值,以尽可能降低时间、空间的复杂度
26 .合并多个有序数组
27 .多个有序排列交叉
28 .两个有序数组求差集
29 .字符串中最长不重复的子串
不足30.10万的回文数量
给定正整数x、y、x两个,有两种中状态转移方式。 一个是f(x(=2) x1,另一个是g (x )=3) x1。 询问x最少可以迁移到y几次,不能迁移到输出-1。
intfunc(intx,int y ) {
if(x0 )返回- 1;
if(xy )返回- 1;
if(x==y )返回0;
intL=func(2*x1,y );
intr=func(3*x1,y );
if(L==-1R==-1 )返回- 1;
if(l==-1 )返回r 1;
返回l 1;
}