算法面试题
qxAi
热爱算法但不是技术宅男
展开
-
每日一题:求数组中出现次数超过一半的元素
求数组n中出现次数超过一半的数这个题目最简单的思路有两种:一种是排序然后顺序枚举统计,复杂度O(NLOGN),还有一种是直接枚举然后用MAP或者HASH去统计,时间复杂度是O(NLOGN(MAP)或者是N(HASH)),但额外的空间复杂度是O(N),这么裸的思路肯定不是最好的答案,面试官肯定还想看到更好的答案。来看这样一个例子:5 1 5 4 1 1 3 1 2 1 1一共11个数原创 2015-01-13 11:21:52 · 2767 阅读 · 4 评论 -
算法面试题之求前1000大&在树上判断节点父子关系
一、有10亿个杂乱无章的数,怎样最快地求出其中前1000大的数。想答对这个题是非常简单的,建立一个大小为1000的小根堆就可以了。这个堆满足两个性质:1.堆中的元素个数总是小于等于1000的2.堆顶取出的元素总是这个堆里面最小的那一个这样,这个题可以这样做:priority_queue q;while (cin>>n){ n=-n; //c++中默认优先队列是一个大根堆,原创 2015-01-13 14:19:56 · 2004 阅读 · 0 评论 -
算法面试题之判断整数是否可以被3整除
一个整数,知道位数,如何判断它是否能被3整除,不可以使用除法和模运算。小学奥数里面学过,如果一个数字各个位上的和是3的倍数,那么它也能被3整除。拿999做例子来看:999各个位上的和是27,27可以被3整除,但是不能用mod运算,如何判断27可以被3整除呢?我们继续递归的去求27个个位上的和:2+7=9,此时,它变成了一个一位数,一位数能被3整除的只有3,6,9三个数字,用if语句就可以表原创 2015-01-13 14:59:33 · 8427 阅读 · 3 评论 -
算法面试题之统计词频前k大
有一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前十个词。算法1:将这10W个单词读入,并排序,然后顺序枚举,每当一个单词和左边的单词相同,则计数器num++,否则,将这个单词还有其词频加入新的数组,最后按频率排序输出前10大。代码如下:sort(s,s+n);int num=0;for (int i=0;i<n;i++){ if (i+1==n || s[原创 2015-01-12 12:27:22 · 7600 阅读 · 0 评论 -
算法面试题之对n个数排序
A文件中最多有n个正整数,而且每个数均小于n,n 这个题用上一篇博客中算法面试题之统计词频前k大中的基于文件的归并排序算法显然是可以秒杀的,但是不是很好写,这道题目强调了每个数字都小于10^7,而且不会出现重复的数字,又给了1M的内存,因此必然是想让我们用一个其他的算法去搞定他,怎么搞定呢?我们来看题目里面出现的不和谐的描述!不会出现重复的数字,每个数字都小于10^7,1M内存这对我们来说原创 2015-01-13 11:43:00 · 2133 阅读 · 0 评论 -
算法面试题之找出不同的数
一共有2N+1个数字,其中只有一个数字出现次数仅1次,剩下每个数字出现次数都是偶数,问那个数字是多少。例如,读入1 2 2 5 1,输出应该是5。这个题已经烂大街了,谁都知道解决方法是异或XOR,也就是C\C++\JAVA中的^符号。由于A^A=0,而且还满足交换律,因此,把读入的所有数字异或到一起,结果就是那个不一样的数字。如果现在读入2N+2个数字,有两个数字落单,那又该怎么办呢?原创 2015-01-13 15:37:08 · 1218 阅读 · 0 评论 -
每日一题之找出两个单独出现的数字
题目:读入2n个数字,其中,除了有两个数字是单独出现外,剩下任何一个数字出现次数都是偶数个,请写出算法找出这两个数字并输出读入样例:81 3 4 5 9 1 4 3输出:5 9思路1:看到这道题目,第一反应就是for循环枚举一遍,然后统计每个数字出现的次数,最后输出出现次数是奇数次的:map num;for (int i=1;i<=n;i++){ cin>原创 2015-01-16 20:11:21 · 1187 阅读 · 0 评论 -
每日一题之二进制下1的个数
题目:输入一个整数n,输出这个整数二进制下1的个数。读入样例:13输出:3解释:13二进制下是1101,一共3个1。看到这道题,首先应考虑到:n是一个整数,而不是正整数,因此,读入一个数字进来以后,第一件事就是应该将它变成它的绝对值。之后来考虑如何把它二进制下1的个数求出来。思路1:短除法。来看这样一个例子:13/2=6……1 6 /2=原创 2015-01-17 18:53:53 · 823 阅读 · 0 评论 -
每日一题之找出频率>1/k的数字
题意描述:读入n个数字,这n个数字中,有一个数字出现的次数>n/k,剩下的每一个数字都是单独出现的,求那个数字是多少?k骗分思路:因为只有答案的那个数字是出现次数>=1次的,那么在读入的时候记录读入的前一个数字,判断这个数字和上一个数字是不是相等,如果相等,则必然是答案。这样子做,已经可以通过绝大多数(几乎100%的)随机数据了,但是依然不能保证AC,例如1 2 1 3 1原创 2015-01-21 08:38:00 · 988 阅读 · 0 评论