引言
自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那以前,自开博以来的21个月每个月都未曾断过。正如上一篇文章支持向量机通俗导论(理解SVM的三层境界)末尾所述:”额,blog许久未有更新了,由于最近实在忙,无暇顾及blog。“与此同时,工做之余,也一直在闲心研究数据挖掘:"神经网络将可能做为Top 10 Algorithms in Data Mining之番外篇第1篇,同时,k-最近邻法(k-nearest neighbor,kNN)算法谈到kd树将可能做为本系列第三篇。这是此系列接下来要写的两个算法,恰好项目中也要用到KD树“。html
但很显然,若要等到下一篇数据挖掘系列的文章时(更新:下一篇kd树目前已经完成:http://t.cn/zjLQ8Ky),说不定要到年末去了,而最近的这段时间,9月、10月,正是各类校招/笔试/面试火热进行的时节,本身则但愿能帮助到这些找工做的朋友,故此,怎能无动于衷,因而,3个多月后,blog今天更新了。node
再者,虽然blog自10年10月开通至11年10月,一年的时间内整理了300多道面试题(这300道题所有集锦在此文中第一部分:http://blog.csdn.net/v_july_v/article/details/6543438)。但毕竟那些题已是前年或去年的了,笔试面试题虽然每一年类型变化不大,但毕竟它年年推陈出新,存着就有其合理性。linux
OK,如下是整理自8月下旬至10月分内的各大公司的笔试面试三十题(注:全部题目基本上所有为软件开发方向,题目来源:网络收集),相信必定能给正在参加各类校招的诸多朋友多少帮助,学习参考或借鉴(若是你手头上有好的笔试/面试题,欢迎经过微博私信:http://weibo.com/julyweibo,或邮箱:zhoulei0907@yahoo.cn发给我,或者干脆直接评论在本文下;同时,若你对如下任何一题有任何见解.想法.思路或建议,欢迎留言评论,你们一块儿讨论,共同享受思考的乐趣,谢谢)。ios
九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题c++
「我正在一点一点作.整理下面的笔试面试题,欢迎读者朋友们跟我一块儿作,你能够把你的答案或代码直接评论在本文之下,也能够经过私信或邮件发给我,感谢诸位。同时,如下全部任何题目所给的点评里的答案,尤为是所给的外部连接如有任何问题,欢迎在本文评论下留言指正,谢谢。答题除了让你感觉到思考的乐趣之外,还有奖哦,请君自看。July、二零一二年十月十一日」
-
9月11日, 京东:web
谈谈你对面向对象编程的认识面试
- 8月20日,金山面试,题目以下:
数据库1中存放着a类数据,数据库2中存放着以天为单位划分的表30张(好比table_20110909,table_20110910,table_20110911),总共是一个月的数据。表1中的a类数据中有一个字段userid来惟一判别用户身份,表2中的30张表(每张表结构相同)也有一个字段userid来惟一识别用户身份。如何断定a类数据库的多少用户在数据库2中出现过?
来源:http://topic.csdn.net/u/20120820/23/C6B16CCF-EE15-47C0-9B15-77497291F2B9.html。
- 百度实习笔试题(2012.5.6)
一、一个单词单词字母交换,可得另外一个单词,如army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程。评点:同去年9月份的一道题,见此文第3题:http://blog.csdn.net/v_july_v/article/details/6803368。
二、线程和进程区别和联系。什么是“线程安全”
三、C和C++怎样分配和释放内存,区别是什么
四、算法题1
一个url指向的页面里面有另外一个url,最终有一个url指向以前出现过的url或空,这两种情形都定义为null。这样构成一个单链表。给两条这样单链表,判断里面是否存在一样的url。url以亿级计,资源不足以hash。
五、算法题2
数组al[0,mid-1] 和 al[mid,num-1],都分别有序。将其merge成有序数组al[0,num-1],要求空间复杂度O(1)
六、系统设计题
百度搜索框的suggestion,好比输入“北京”,搜索框下面会以北京为前缀,展现“北京爱情故事”、“北京公交”、“北京医院”等等搜索词,输入“结构之”,会提示“结构之法”,“结构之法 算法之道”等搜索词。
请问,如何设计此系统,使得空间和时间复杂度尽可能低。

评点:①直接上Trie树「Trie树的介绍见:从Trie树(字典树)谈到后缀树」 + TOP K「hashmap+堆,hashmap+堆 统计出如10个近似的热词,也就是说,只存与关键词近似的好比10个热词,详细方法可参看此文第2个题的讲解:http://blog.csdn.net/v_july_v/article/details/7382693」?
②or Double-array trie tree?同时,StackOverflow上也有两个讨论帖子:http://stackoverflow.com/questions/2901831/algorithm-for-autocomplete,http://stackoverflow.com/questions/1783652/what-is-the-best-autocomplete-suggest-algorithm-datastructure-c-c。
③此外,这里有一篇关于“拼写错误检查”问题的介绍,或许对你有所启示:http://blog.afterthedeadline.com/2010/01/29/how-i-trie-to-make-spelling-suggestions/。。
- 人搜笔试
1. 快排每次以第一个做为主元,问时间复杂度是多少?(O(N*logN))
2. T(N) = N + T(N/2)+T(2N), 问T(N)的时间复杂度是多少? 点评:O(N*logN) or O(N)?
3. 从(0,1)中平均随机出几回才能使得和超过1?(e)
4.编程题:
一棵树的节点定义格式以下:
struct Node{
Node* parent;
Node* firstChild; // 孩子节点
Node* sibling; // 兄弟节点
}
要求非递归遍历该树。
思路:采用队列存储,来遍历节点。
5. 算法题:
有N个节点,每两个节点相邻,每一个节点只与2个节点相邻,所以,N个顶点有N-1条边。每一条边上都有权值wi,定义节点i到节点i+1的边为wi。
求:不相邻的权值和最大的边的集合。
- 人搜面试,所投职位:搜索研发工程师:面试题回忆
一、删除字符串开始及末尾的空白符,而且把数组中间的多个空格(若是有)符转化为1个。
二、求数组(元素可为正数、负数、0)的最大子序列和。
三、链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g
四、链表克隆。链表的结构为:
typedef struct list {
int data; //数据字段
list *middle; //指向链表中某任意位置元素(可指向本身)的指针
list *next;//指向链表下一元素
} list;
五、100万条数据的数据库查询速度优化问题,解决关键点是:根据主表元素特色,把主表拆分并新建副表,而且利用存储过程保证主副表的数据一致性。(不用写代码)
六、求正整数n全部可能的和式的组合(如;4=1+1+1+一、1+1+二、1+三、2+1+一、2+2)。点评:这里有一参考答案:http://blog.csdn.net/wumuzi520/article/details/8046350。
七、求旋转数组的最小元素(把一个数组最开始的若干个元素搬到数组的末尾,咱们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1)
八、找出两个单链表里交叉的第一个元素
九、字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小
十、时间复杂度为O(1),怎么找出一个栈里的最大元素
十一、线程、进程区别
十二、static在C和C++里各表明什么含义
1三、const在C/C++里什么意思
1四、经常使用linux命令
1五、解释Select/Poll模型
- 网易有道二面:
判断一个数字序列是BST后序遍历的结果,现场写代码。
来源:http://blog.csdn.net/hopeztm/article/category/1201028;
- 8月30日,网易有道面试题
var tt = 'aa';
function test()
{
alert(tt);
var tt = 'dd';
alert(tt);
}
test();
- 8月31日,百度面试题:不使用随机数的洗牌算法,详情:http://topic.csdn.net/u/20120831/10/C837A419-DFD4-4326-897C-669909BD2086.html;
- 9月6日,阿里笔试题:平面上有不少点,点与点之间有可能有连线,求这个图里环的数目。
- 9月7日,一道华为上机题:
题目描述: 选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每一个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type == 1,表示专家评委,judge_type == 2,表示大众评委,n表示评委总数。打分规则以下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),而后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。若是没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。
函数接口 int cal_score(int score[], int judge_type[], int n)
上机题目须要将函数验证,可是题目中默认专家评委的个数不能为零,可是如何将这种专家数目为0的情形排除出去。
来源:http://topic.csdn.net/u/20120907/15/c30eead8-9e49-41c2-bd11-c277030ad17a.html;
- 9月8日,腾讯面试题:
假设两个字符串中所含有的字符和个数都相同咱们就叫这两个字符串匹配,
好比:abcda和adabc,因为出现的字符个数都是相同,只是顺序不一样,
因此这两个字符串是匹配的。要求高效!
又是跟上述第3题中简单题一的兄弟节点相似的一道题,我想,大家能想到的,这篇blog里:http://blog.csdn.net/v_JULY_v/article/details/6347454都已经有了。
- 阿里云,搜索引擎中5亿个url怎么高效存储;
- 一道C++笔试题,求矩形交集的面积:
在一个平面坐标系上,有两个矩形,它们的边分别平行于X和Y轴。
其中,矩形A已知, ax1(左边), ax2(右边), ay1(top的纵坐标), ay2(bottom纵坐标). 矩形B,相似,就是 bx1, bx2, by1, by2。这些值都是整数就OK了。
要求是,若是矩形没有交集,返回-1, 有交集,返回交集的面积。
int area(rect const& a, rect const& b)
{
...
}
点评:
healer_kx:
补齐代码,最好是简洁的,别用库。你能够写你的辅助函数,宏定义,代码风格也很重要。
ri_aje:
- struct rect
- {
-
-
- double x [2];
- double y [2];
- };
-
- template <typename T> T const& min (T const& x, T const& y) { return x<y ? x : y; }
- template <typename T> T const& max (T const& x, T const& y) { return x>y ? x : y; }
-
- double area (rect const& a, rect const& b)
- {
-
- double const dx = min(a.x[1],b.x[1]) - max(a.x[0],b.x[0]);
- double const dy = min(a.y[1],b.y[1]) - max(a.y[0],b.y[0]);
- return dx>=0&&dy>=0 ? dx*dy : -1;
- }
下面是一个简短的证实。
对于平行于坐标轴的矩形 r,假设其左下角点坐标为 (rx0,ry0),右上角点坐标为 (rx1,ry1),那么由 r 定义的无限有界点集为:{(x,y)|x in [rx0,rx1] && y in [ry0,ry1]}。
根据交集的定义,则任意二维点 (x,y) 在矩形 a,b 的交集内等价于
{(x,y)|(x,y) in a 而且 (x,y) in b} <==>
{(x,y)|x in [ax0,ax1] && x in [bx0,bx1] 而且 y in [ay0,ay1] && y in [by0,by1]} <==>
{(x,y)|x in [max(ax0,bx0),min(ax1,bx1)] 而且 y in [max(ay0,by0),min(ay1,by1)]}
所以,交集矩形的边长分别为 min(ax1,bx1)-max(ax0,bx0) 和 min(ay1,by1)-max(ay0,by0)。注意当交集为空时(a,b 不相交),则经此法计算出来的交集边长为负值,此事实可用于验证 a,b 的相交性。
鉴于笛卡尔积各个维度上的不相关性,此方法可扩展到任意有限维线性空间,好比,三维空间中平行于坐标轴的长方体的交集体积能够用相似的方法计算。
来源:http://topic.csdn.net/u/20120913/18/bc669d60-b70a-4008-be65-7c342789b925.html。
- 2012年创新工场校园招聘最后一道笔试题:工场很忙
创新工场每一年会组织同窗与项目的双选会,假设如今有M个项目,编号从1到M,另有N名同窗,编号从1到N,每名同窗能选择最多三个、最少一个感兴趣的项目。选定以后,HR会安排项目负责人和相应感兴趣的同窗一对一面谈,每次面谈持续半小时。因为你们平时都很忙,因此我们要尽可能节约时间,请你按照如下的条件设计算法,帮助HR安排面试。
1)同窗很忙。项目负责人一次只能与一名同窗面谈,而同窗会在本身第一个面试开始时达到工场,最后一个面试结束后离开工场,若是参加一个项目组的面试后不能当即参加下一个项目组的面试,就必须在工场等待。因此请尽量让同窗的面试集中在某一时间段,减小同窗在工场等待的时间。
2)项目负责人很忙。众所周知,创业团队的负责人会有不少事情要作,因此他们但愿可以将本身参与的面试集中在某一段时间内,请在保证1)的状况下,使得项目负责人等待的时间最少。
3)HR很忙。从第一轮面试开始之后,全部HR都必须等到最后一轮面试结束,因此须要在保证1)和2)的同时,也能尽快解放掉全部的HR,即让第一轮面试到最后一轮面试之间持续的时间最短。
输入(以文件方式输入,文件名为iw,例如iw.in):
第1行...第n行:同窗的编号 项目的编号
样例(数据间用空格隔开,两个0表示输入结束):
1 1
1 2
1 3
2 1
3 1
3 2
0 0
表示M=3,N=3,编号为1的同窗选择了项目1,2和3,编号为2的同窗选择了项目1,编号为3的同窗选了项目1和2
输出(以文件方式输出,文件名为iw,例如iw.out):
第1行:编号为1的项目依次面试新同窗的编号序列
第2行:编号为2的项目依次面试新同窗的编号序列
...
第n行:编号为n的项目依次面试新同窗的编号序列
样例(数据间用空格隔开,0表示没有面试):
1 3 2
3 1 0
0 0 1
表示编号为1的项目在第一轮面试编号为1的同窗,第二轮面试编号为3的同窗,第三轮面试编号为2的同窗
编号为2的项目在第一轮面试编号为3的同窗,第二轮面试编号为1的同窗,第二轮不用面试
编号为3的项目在第一轮和第二轮都不用面试,第三轮面试编号为1的同窗
连接:http://t.qq.com/p/t/108332110988802;
-
4**9 的笔试题,比较简单:
1.求链表的倒数第二个节点
2.有一个整数数组,求数组中第二大的数算法
-
阿里巴巴二道题
第一道:
对于给定的整数集合S,求出最大的d,使得a+b+c=d。a,b,c,d互不相同,且都属于S。集合的元素个数小于等于2000个,元素的取值范围在[-2^28,2^28 - 1],假定可用内存空间为100MB,硬盘使用空间无限大,试分析时间和空间复杂度,找出最快的解决方法。
点评:
@绿色夹克衫:两两相加转为多项式乘法,好比(1 2 4 6) + (2 3 4 5) => (x + x^2 + x^4 + x^6)*(x^2 + x^3 + x^4 + x^5) 。更多思路请见这:
http://www.51nod.com/answer/index.html#!answerId=569。
阿里巴巴第二道(研发类)
笔试题1,原题大体描述有一大批数据,百万级别的。数据项内容是:用户ID、科目ABC各自的成绩。其中用户ID为0~1000万之间,且是连续的,能够惟一标识一条记录。科目ABC成绩均在0~100之间。有两块磁盘,空间大小均为512M,内存空间64M。
1) 为实现快速查询某用户ID对应的各科成绩,问磁盘文件及内存该如何组织;
2) 改变题目条件,ID为0~10亿之间,且不连续。问磁盘文件及内存该如何组织;
3) 在问题2的基础上,增长一个需求。在查询各科成绩的同时,获取该用户的排名,问磁盘文件及内存该如何组织。
笔试题2:代码实现计算字符串的类似度。
点评:和计算两字符串的最长公共子序列类似。
设Ai为字符串A(a1a2a3 … am)的前i个字符(即为a1,a2,a3 … ai)
设Bj为字符串B(b1b2b3 … bn)的前j个字符(即为b1,b2,b3 … bj)
设 L(i , j)为使两个字符串和Ai和Bj相等的最小操做次数。
当ai等于bj时 显然L(i, j)=L(i-1, j-1)
当ai不等于bj时
若将它们修改成相等,则对两个字符串至少还要操做L(i-1, j-1)次
若删除ai或在Bj后添加ai,则对两个字符串至少还要操做L(i-1, j)次
若删除bj或在Ai后添加bj,则对两个字符串至少还要操做L(i, j-1)次
此时L(i, j)=min( L(i-1, j-1), L(i-1, j), L(i, j-1) ) + 1
显然,L(i, 0)=i,L(0, j)=j, 再利用上述的递推公式,能够直接计算出L(i, j)值。具体代码请见这:
http://blog.csdn.net/flyinghearts/article/details/5605996。
- 9月14日,小米笔试,给一个浮点数序列,取最大乘积子序列的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积子序列为3,0.5,8。
点评:
解法1、
或许,读者初看此题,天然会想到最大乘积子序列问题相似于最大子数组和问题:http://blog.csdn.net/v_JULY_v/article/details/6444021,然实则具体处理起来诸多不一样,为何呢,由于乘积子序列中有正有负也还可能有0。
既如此,咱们能够把问题简化成这样:数组中找一个子序列,使得它的乘积最大;同时找一个子序列,使得它的乘积最小(负数的状况)。由于虽然咱们只要一个最大积,但因为负数的存在,咱们同时找这两个乘积作起来反而方便。也就是说,不但记录最大乘积,也要记录最小乘积。So,
咱们让maxCurrent表示当前最大乘积的candidate,
minCurrent反之,表示当前最小乘积的candidate。
(用candidate这个词是由于只是可能成为新一轮的最大/最小乘积),
而maxProduct则记录到目前为止全部最大乘积candidates的最大值。
因为空集的乘积定义为1,在搜索数组前,maxCurrent,minCurrent,maxProduct都赋为1。
假设在任什么时候刻你已经有了maxCurrent和minCurrent这两个最大/最小乘积的candidates,新读入数组的元素x(i)后,新的最大乘积candidate只多是maxCurrent或者minCurrent与x(i)的乘积中的较大者,若是x(i)<0致使maxCurrent<minCurrent,须要交换这两个candidates的值。
当任什么时候候maxCurrent<1,因为1(空集)是比maxCurrent更好的candidate,因此更新maxCurrent为1,相似的能够更新minCurrent。任什么时候候maxCurrent若是比最好的maxProduct大,更新maxProduct。
具体代码以下:
- template <typename Comparable>
- Comparable maxprod( const vector<Comparable>&v)
- {
- int i;
- Comparable maxProduct = 1;
- Comparable minProduct = 1;
- Comparable maxCurrent = 1;
- Comparable minCurrent = 1;
-
-
- for( i=0; i< v.size() ;i++)
- {
- maxCurrent *= v[i];
- minCurrent *= v[i];
- if(maxCurrent > maxProduct)
- maxProduct = maxCurrent;
- if(minCurrent > maxProduct)
- maxProduct = minCurrent;
- if(maxCurrent < minProduct)
- minProduct = maxCurrent;
- if(minCurrent < minProduct)
- minProduct = minCurrent;
- if(minCurrent > maxCurrent)
- swap(maxCurrent,minCurrent);
- if(maxCurrent<1)
- maxCurrent = 1;
-
-
- }
- return maxProduct;
- }
解法2、
本题除了上述相似最大子数组和的解法,也能够直接用动态规划求解(其实,上述的解法一本质上也是动态规划,只是解题所表现出来的具体形式与接下来的解法二不一样罢了。这个不一样就在于下面的解法二会写出动态规划问题中经典常见的状态转移方程,而解法一是直接求解)。具体解法以下:
假设数组为a[],直接利用动归来求解,考虑到可能存在负数的状况,咱们用Max[i]来表示以a[i]结尾的最大连续子序列的乘积值,用Min[i]表示以a[i]结尾的最小的连续子序列的乘积值,那么状态转移方程为:
Max[i]=max{a[i], Max[i-1]*a[i], Min[i-1]*a[i]};
Min[i]=min{a[i], Max[i-1]*a[i], Min[i-1]*a[i]};
初始状态为Max[1]=Min[1]=a[1]。代码以下:
- void longest_multiple(int *a,int n){
- int *Min=new int[n+1]();
- int *Max=new int[n+1]();
- int *p=new int[n+1]();
-
- for(int i=0;i<=n;i++){
- p[i]=-1;
- }
- Min[1]=a[1];
- Max[1]=a[1];
- int max_val=Max[1];
- for(int i=2;i<=n;i++){
- Max[i]=max(Max[i-1]*a[i],Min[i-1]*a[i],a[i]);
- Min[i]=min(Max[i-1]*a[i],Min[i-1]*a[i],a[i]);
- if(max_val<Max[i])
- max_val=Max[i];
- }
- if(max_val<0)
- printf("%d",-1);
- else
- printf("%d",max_val);
- delete [] Max;
- delete [] Min;
- }
变种
此外,此题还有另外的一个变种形式,即给定一个长度为N的整数数组,只容许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度。
咱们能够把全部可能的(N-1)个数的组合找出来,分别计算它们的乘积,并比较大小。因为总共有N个(N-1)个数的组合,总的时间复杂度为O(N2),显然这不是最好的解法。
OK,如下解答来自编程之美
解法1

解法2
此外,还能够经过分析,进一步减小解答问题的计算量。假设N个整数的乘积为P,针对P的正负性进行以下分析(其中,AN-1表示N-1个数的组合,PN-1表示N-1个数的组合的乘积)。
1.P为0 那么,数组中至少包含有一个0。假设除去一个0以外,其余N-1个数的乘积为Q,根据Q的正负性进行讨论:
Q为0
说明数组中至少有两个0,那么
N-1个数的乘积只能为0,返回0;
Q为正数
返回
Q,由于若是以0替换此时
AN
-1中的任一个数,所获得的
PN
-1为0,必然小于
Q;
Q为负数
若是以0替换此时
AN
-1中的任一个数,所获得的
PN
-1为0,大于
Q,乘积最大值为0。
2. P为负数sql
根据“负负得正”的乘法性质,天然想到从
N个整数中去掉一个负数,使得
PN
-1为一个正数。而要使这个正数最大,这个被去掉的负数的绝对值必须是数组中最小的。咱们只须要扫描一遍数组,把绝对值最小的负数给去掉就能够了。
3. P为正数shell
相似地,若是数组中存在正数值,那么应该去掉最小的正数值,不然去掉绝对值最大的负数值。
上面的解法采用了直接求N个整数的乘积P,进而判断P的正负性的办法,可是直接求乘积在编译环境下每每会有溢出的危险(这也就是本题要求不使用除法的潜在用意),事实上可作一个小的转变,不须要直接求乘积,而是求出数组中正数(+)、负数(-)和0的个数,从而判断P的正负性,其他部分与以上面的解法相同。
在时间复杂度方面,因为只须要遍历数组一次,在遍历数组的同时就可获得数组中正数(+)、负数(-)和0的个数,以及数组中绝对值最小的正数和负数,时间复杂度为O(N)。
- 9月15日,中兴面试:
小端系统
- union{
- int i;
- unsigned char ch[2];
- }Student;
-
-
- int main()
- {
- Student student;
- student.i=0x1420;
- printf("%d %d",student.ch[0],student.ch[1]);
- return 0;
- }
输出结果为?(答案:32 20)
- 一道有趣的Facebook面试题:
给一个二叉树,每一个节点都是正或负整数,如何找到一个子树,它全部节点的和最大?
点评:
@某猛将兄:后序遍历,每个节点保存左右子树的和加上本身的值。额外一个空间存放最大值。
@陈利人:同窗们,若是你面试的是软件工程师的职位,通常面试官会要求你在短期内写出一个比较整洁的,最好是高效的,没有什么bug的程序。因此,光有算法不够,还得多实践。
写完后序遍历,面试官可能接着与你讨论,a). 若是要求找出只含正数的最大子树,程序该如何修改来实现?b). 假设咱们将子树定义为它和它的部分后代,那该如何解决?c). 对于b,加上正数的限制,方案又该如何?总之,一道看似简单的面试题,可能能变换成各类花样。
好比,面试管可能还会再提两个要求:第一,不能用全局变量;第一,有个参数控制是否要只含正数的子树。其它的,随意,固然,编程风格也很重要。
- 谷歌面试题:
有几百亿的整数,分布的存储到几百台经过网络链接的计算机上,你可否开发出一个算法和系统,找出这几百亿数据的中值?就是在一组排序好的数据中居于中间的数。显然,一台机器是装不下全部的数据。也尽可能少用网络带宽。
- 小米,南京站笔试(原第20题):
一个数组里,数都是两两出现的,可是有三个数是惟一出现的,找出这三个数。
点评:
3个数惟一出现,各不相同。因为x与a、b、c都各不相同,所以x^a、x^b、x^c都不等于0。具体答案请参看这两篇文章:一、http://blog.csdn.net/w397090770/article/details/8032898,二、http://zhedahht.blog.163.com/blog/static/25411174201283084246412/。
- 9月19日,IGT面试:你走到一个分叉路口,有两条路,每一个路口有一我的,一个说假话,一个说真话,你只能问其中一我的仅一个问题,如何问才能获得正确答案?点评:答案是,问其中一我的:另外一我的会说你的路口是通往正确的道路么?
- 9月19日,创新工厂笔试题:
给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序。
即:数组a[]; 对于i < j 且 a[i] > a[j],则称这是一个反序。
给定一个数组,要求写一个函数,计算出这个数组里全部反序的个数。
点评:
归并排序,至于有的人说是否有O(N)的时间复杂度,我认为答案是否认的,正如老梦所说,下限就是nlgn,n个元素的数组的排列共有的排列是nlgn,n!(算法导论里面也用递归树证实了:O(n*logn)是最优的解法,具体能够看下这个连接:)。而后,我再给一个连接,这里有那天笔试的两道题目:http://blog.csdn.net/luno1/article/details/8001892。
- 9月20日,创新工厂南京站笔试:
已知字符串里的字符是互不相同的,如今任意组合,好比ab,则输出aa,ab,ba,bb,编程按照字典序输出全部的组合。
点评:非简单的全排列问题(跟全排列的形式不一样,abc 全排列的话,只有6个不一样的输出:http://blog.csdn.net/v_july_v/article/details/6879101)。本题可用递归的思想,设置一个变量表示已输出的个数,而后当个数达到字符串长度时,就输出。
- void perm(char *str, int size, int resPos)
- {
- if(resPos == size)
- print(result);
- else
- {
- for(int i = 0; i < size; ++i)
- {
- result[resPos] = str[i];
- perm(str, size, resPos + 1);
- }
- }
- }
- 9月21日,小米,电子科大&西安交通大学笔试题:
- void fun()
- {
- unsigned int a = 2013;
- int b = -2;
- int c = 0;
- while (a + b > 0)
- {
- a = a + b;
- c++;
- }
- printf("%d", c);
- }
问:最后程序输出是多少?点评:此题有陷阱,答题需谨慎!


点评:
针对上述第3题朋友圈的问题,读者@互联网的飞虫提供的解法及代码以下(有任何问题,欢迎指正,多谢):
- #include <STDIO.H>
- #include <WINDOWS.H>
-
-
- int Friends(int n, int m , int* r[]);
-
- int main(int argc,char** argv)
- {
- int r[5][2] = {{1,2},{4,3},{6,5},{7,8},{7,9}};
-
- printf("有%d个朋友圈。\n",Friends(0,5,(int**)r));
- return 0;
- }
-
- int Friends(int n, int m, int* r[])
- {
-
- int *p = (int*)malloc(sizeof(int)*m*3);
-
- memset(p,0,sizeof(int)*m*3);
- int i = 0;
-
- int iCount = 0;
-
- int j = 0;
-
- int * q = (int*)r;
-
- for (i=0;i<m;++i)
- {
- for (j=0;j<2;++j)
- {
- p[i*3+j]=q[i*2+j];
- }
-
- p[i*3+j] = 0;
- }
-
- bool bFlag = false;
-
- for (i=0;i<m;++i)
- {
- bFlag = false;
- if (p[i*3+2]==1)
- {
- bFlag = true;
- }
- p[i*3+2] = 1;
- for (j=0;j<m;++j)
- {
- if (i==j)
- {
- continue;
- }
-
-
- if (p[i*3]==p[j*3] ||
- p[i*3] == p[j*3+1] ||
- p[i*3+1] == p[j*3+0] ||
- p[i*3+1] == p[j*3+1])
- {
- if (p[j*3+2]==1)
- {
- bFlag = true;
- }
- p[j*3+2] = 1;
- }
- }
-
- if (!bFlag)
- {
- ++iCount;
- }
- }
-
- free(p);
-
- return iCount;
- }
- 9月21日晚,海豚浏览器笔试题:
一、有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列,对于1<=i,j<=k,求k个最小的(ai+bj),要求算法尽可能高效。
二、输入:
L:“shit”“fuck”“you”
S:“shitmeshitfuckyou”
输出:S中包含的L一个单词,要求这个单词只出现一次,若是有多个出现一次的,输出第一个这样的单词
怎么作?
- 9月22日上午,百度西安站全套笔试题以下:

点评:上述的系统设计题简单来说,是创建起按键号码数字到人名(手机号)的映射关系,具体讲,步骤解法以下图所示:

3.算法与程序设计
第一题:
某个公司举行一场羽毛球赛,有1001我的参加,如今为了评比出“最厉害的那我的”,进行淘汰赛,请问至少须要进行多少次比赛。
第二题
有100个灯泡,第一轮把全部灯泡都开启,第二轮把奇数位的灯泡灭掉,第三轮每隔两个灯泡,灭一个,开一个,依此类推。求100轮后还亮的灯泡。
点评:彻底平方数,本人去58面试时,也遇到过与此相似的题。
第三题
有20个数组,每一个数组里面有500个数组,降序排列,每一个数字是32位的unit,求出这10000个数字中最大的500个。
点评:http://www.51nod.com/question/index.html#!questionId=647。
4.系统设计题
相似作一个手机键盘,上面有1到9个数字,每一个数字都表明几个字母(好比1表明abc三个字母,z表明wxyz等等),如今要求设计当输入某几个数字的组合时,查找出通信录中的人名及电话号码。
其它的还有三道简答题,好比线程的死锁,内存的管理等等。最后,附一讨论帖子:http://topic.csdn.net/u/20120923/18/7fd148b2-c000-4326-93a6-cb3bb8675702.html。
- 9月22日,微软笔试:
T(n)=1(n<=1),T(n) = 25*T(n/5) + n^2,求算法的时间复杂度。更多题目请参见:http://blog.csdn.net/wonderwander6642/article/details/8008209。
- 9月23日,腾讯校招部分笔试题(特别提醒:下述试卷上的答案只是一考生的解答,非表明正确答案.以下面第11题答案选D,第12题答案选C,至于解释可看这里:http://coolshell.cn/articles/7965.html):


点评:根号九说,不过最后两道大的附加题,全是秒杀99%海量数据处理面试题里的:http://blog.csdn.net/v_july_v/article/details/7382693,太感谢July了。
- 9月23日,搜狗校招武汉站笔试题:
1、已知计算机有如下原子操做
一、 赋值操做:b = a;
二、 ++a和a+1;
三、for( ){ ***}有限循环;
四、操做数只能为0或者正整数;
五、定义函数
实现加减乘操做
2、对一个链表进行排序,效率越高越好,LinkedList<Integer>.

附:9月15日,搜弧校招笔试题:http://blog.csdn.net/hackbuteer1/article/details/8015964。
- 搜狗校招笔试题:
100个任务,100个工人每人可作一项任务,每一个任务每一个人作的的费用为t[100][100],求一个分配任务的方案使得总费用最少。
点评:匈牙利算法,能够看看这篇文章:http://www.byvoid.com/blog/hungary/,及这个连接:http://www.51nod.com/question/index.html#!questionId=641。
- 9月24日,Google南京等站全套笔试题以下:





点评:
谷歌的笔试从易到难,基础到复杂,涵盖操做系统 网络 数据结构 语言 数学思惟 编程能力 算法能力,基本上能把一我的的能力全面考察出来。
至于上述2.1寻找3个数的中位数,请看读者sos-phoenix给出的思路及代码:
- 2.1
- if (a <= b) {
- if (b <= c)
- return b;
- else {
- if (a <=c)
- return c;
- else
- return a;
- }
- }
- else {
- if (a <= c)
- return a;
- else {
- if (b <= c)
- return c;
- else
- return b;
- }
- }
最坏状况下的比较次数:3 (次)
平均状况下的比较次数:(2×2 + 4*3)/6 = 8/3 (次)
此外这题,微博上的左耳朵耗子后来也给出了一个连接:http://stackoverflow.com/questions/1582356/fastest-way-of-finding-the-middle-value-of-a-triple,最后是微博上的梁斌penny的解答:http://weibo.com/1497035431/yFusm7obQ。其他更多参考答案请看本文评论下第93楼。
- 读者来信,提供的几个hulu面试题:
9月19号,hulu电面:
问题1 两个骰子,两我的轮流投,直到点数和大于6就中止,最终投的那我的获胜。问先投那我的获胜几率?
问题2 平面上n个圆,任意两个都相交,是否有一条直线和全部的圆都有交点。
9月22号,上午hulu面试
问题1 100我的,每人头上戴一顶帽子,写有0..99的一个数,数可能重复,每一个人都只能看到除本身之外其余人的帽子。每一个人须要说出本身的帽子的数,一我的说对就算赢。点评:参考答案请看这个连接:http://www.51nod.com/question/index.html#!questionId=642。
问题2 n台机器,每台有负载,以和负载成正比的几率,随机选择一台机器。「原题是但愿设计O(1)的算法(预处理O(n)不可少,要算出每台机器的比例),由于非O(1)的话,就trivial了:能够产生随机数例如[0,1)而后,根据负载比例,2分或者直接循环检查落入哪一个区间,决定机器。 面试官想问,有没更好的办法,避免那种查找。即可否屡次(常数次)调用随机函数,拟合出一个几率分布」
问题3 行列都递增的矩阵,求中位数。点评:http://www.51nod.com/question/index.html#!questionId=643,http://blog.csdn.net/v_july_v/article/details/7085669(杨氏矩阵查找问题)。
- 西安百度软件研发工程师:
一面(2012.9.24):
问的比较广,涉及操做系统、网络、数据结构。比较难的就2道题。
(1)10亿个int型整数,如何找出重复出现的数字;
(2)有2G的一个文本文档,文件每行存储的是一个句子,每一个单词是用空格隔开的。问:输入一个句子,如何找到和它最类似的前10个句子。(提示:可用倒排文档)。
二面(2012.9.25):
(1)一个处理器最多能处理m个任务。如今有n个任务须要完成,每一个任务都有本身完成所需的时间。此外每一个任务之间有依赖性,好比任务A开始执行的前提是任务B必须完成。设计一个调度算法,使得这n这任务的完成时间最小;
(2)有一个排序二叉树,数据类型是int型,如何找出中间大的元素;
(3)一个N个元素的整形数组,如何找出前K个最大的元素。
(4)给定一个凸四边形,如何判断一个点在这个平面上。
点评:本题的讨论及参考答案请见这:http://www.51nod.com/question/index.html#!questionId=669。
运维部(2012.9.27):
(1)堆和栈的区别;
(2)问如何数出本身头上的头发。
- 9月25日,人人网笔试题:

点评:参考答案请见,http://www.51nod.com/question/index.html#!questionId=671。
- 9月25日晚,创新工场校园招聘北邮站笔试:




- 9月25日,小米大连站笔试题:
1一共有100万,抽中的2万,每个月增长4万,问20个月能抽中的几率为:?
2 for(int i=0;i<strlen(s);i++){n+=I;}时间复杂度O(n)
3 手机wifi(A)….wifi ap….局域网(B)…..路由器…ADSL(C)…..互联网…..服务器
断掉上述ABC哪些点TCP连接会马上断掉?
4 12345入栈,出栈结果 21543 31245 43215 12534 可能的为?(第一个和第三个)
5 x^n+a1x^n-1+…+an-1x+an,最少要作—乘法?题目中a1,a2,an为常数。
- 9月26日,百度一二面:
一、给定一数组,输出知足2a=b(a,b表明数组中的数)的数对,要求时间复杂度尽可能低。
二、搜索引擎多线程中每一个线程占用多少内存?若是搜索引擎存储网页内存占用太大怎么解决?
三、有不少url,例如*.baidu.com,*.sina.com ......
如今给你一个sports.sina.com 快速匹配出是*.sina.com。点评:老题,此前blog内曾整理过。
四、找出字符串的编辑距离,即把一个字符串s1最少通过多少步操做变成编程字符串s2,操做有三种,添加一个字符,删除一个字符,修改一个字符(只要听过编辑距离,知道往动态规划上想,很快就能够找到解法)。

点评:请看连接:http://blog.csdn.net/Lost_Painting/article/details/6457334。
五、编程实现memcopy,注意考虑目标内存空间和源空间重叠的时候。
六、实现简单的一个查找二叉树的深度的函数。
- 9月26日晚,优酷土豆笔试题一道:
优酷是一家视频网站,天天有上亿的视频被观看,如今公司要请研发人员找出最热门的视频。
该问题的输入能够简化为一个字符串文件,每一行都表示一个视频id,而后要找出出现次数最多的前100个视频id,将其输出,同时输出该视频的出现次数。
1.假设天天的视频播放次数为3亿次,被观看的视频数量为一百万个,每一个视频ID的长度为20字节,限定使用的内存为1G。请简述作法,再写代码。
2.假设每月的视频播放次数为100亿次,被观看的视频数量为1亿,每一个视频ID的长度为20字节,一台机器被限定使用的内存为1G。
点评:有关海量数据处理的题目,请到此文中找方法(不管题目形式怎么变,基本方法不变,固然,最最经常使用的方法是:分而治之/Hash映射 + Hash统计 + 堆/快速/归并排序):http://blog.csdn.net/v_july_v/article/details/7382693。注:上题第二问文件太大,则可如模1000,把整个大文件映射为1000个小文件再处理 ....
- 9月26日,baidu面试题:
1.进程和线程的区别
2.一个有序数组(从小到大排列),数组中的数据有正有负,求这个数组中的最小绝对值
3.链表倒数第n个元素
4.有一个函数fun能返回0和1两个值,返回0和1的几率都是1/2,问怎么利用这个函数获得另外一个函数fun2,使fun2也只能返回0和1,且返回0的几率为1/4,返回1的几率为3/4。(若是返回0的几率为0.3而返回1的几率为0.7呢)
5.有8个球,其中有7个球的质量相同,另外一个与其余球的质量不一样(且不知道是比其余球重仍是轻),请问在最坏的状况下,最少须要多少次就能找出这个不一样质量的球
6.数据库索引
7.有一个数组a,设有一个值n。在数组中找到两个元素a[i]和a[j],使得a[i]+a[j]等于n,求出全部知足以上条件的i和j。
8.1万个元素的数组,90%的元素都是1到100的数,10%的元素是101--10000的数,如何高效排序。
- 小米的web开发笔试题:
一场星际争霸比赛,共8我的,每一个人的实力用分数表示,要分红两队,如何保证明力最平均?给定一个浮点数的序列,F1,F2,……,Fn(1<=n<=1000),定义P(s,e)为子序列Fi(s<=i<=e)的积,求P的最大值。
- 9月27日,趋势科技面试题:
马路口,30分钟内看到汽车的几率是95%,那么在10分钟内看不到汽车的几率是?
- 9月27日晚,IGT笔试题:
给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。
要求:空间复杂度是O(1),且只能遍历一次字符串。
点评:本质是荷兰国旗问题,相似快排中partition过程,具体思路路分析及代码能够参考此文第8节:http://blog.csdn.net/v_july_v/article/details/6211155。
- 9月27日,人人两面:
一面
1 实现atoi
2 单链表变形 如 1 2 3 4 5 变为 1 3 5 4 2 如1 2 3 4 变为 1 3 4 2
(就是拆分链表 把偶数为反过来接在奇数位后面)
二面
1 二叉树查找不严格小于一个值的最大值(返回节点)。
2 有序数组里二分查找一个数(若是有相同的找最后一次出现的)。
3 等价于n*n的矩阵,填写0,1,要求每行每列的都有偶数个1 (没有1也是偶数个),问有多少种方法。
评论:开始觉得是算法题,想了狂搜,递推(dp,能够用xor表示一行的列状态,累加),分治,(拆两半,而后上半段下半段的列有相同的奇偶性)。后来,本身算了几个发现n = 1 n = 2 n = 3 的结果,他告诉了我n = 4是多少,而后发现f(n) = 2^((n - 1) ^2) 。最后我给出了一个巧妙的证实。而后发现若是是m*n的矩阵也是相似的答案,不局限于方阵。此外,题目具体描述能够看看这里:http://blog.himdd.com/?p=2480。
9月27日,小米两面:
一面:
除了聊研究,就一道题
1 数组里找到和最接近于0的两个值。
二面:
1 行列有序的矩阵查找一个数
2 直方图最大矩形。点评:这里有此题的具体表述及一份答案:http://blog.csdn.net/xybsos/article/details/8049048。
3 next_permutation
4 字符串匹配 含有* ? (写代码)
5 实现strcpy memmove (必须写代码)
- void* memmove(void* dest, void* source, size_t count)
- {
-
- void* ret = dest;
-
- if (dest <= source || dest >= (source + count))
- {
-
-
- while (count --)
- *dest++ = *source++;
- }
- else
- {
-
-
- dest += count - 1;
- source += count - 1;
-
- while (count--)
- *dest-- = *source--;
- }
- return ret;
- }
更多,还能够参见此文第三节节末:http://blog.csdn.net/v_july_v/article/details/6417600,或此文:http://www.360doc.com/content/11/0317/09/6329704_101869559.shtml。
6 读数 (千万亿,百万亿……)变为数字 (说思路便可,字符串查找,填写各个权值的字段,而后判断是否合法,读前面那些×权值,累加)。
- 9月27日,Hulu 2013北京地区校招笔试题
填空题:
一、中序遍历二叉树,结果为ABCDEFGH,后序遍历结果为ABEDCHGF,那么前序遍历结果为?
二、对字符串HELL0_HULU中的字符进行二进制编码,使得字符串的编码长度尽量短,最短长度为?
三、对长度12的有序数组进行二分查找,目标等几率出如今数组的每一个位置上,则平均比较次数为?
四、一副扑克(去王),每一个人随机的摸两张,则至少须要多少人摸牌,才能保证有两我的抽到一样的花色。
五、x个小球中有惟一一个球较轻,用天平秤最少称量y次能找出这个较轻的球,写出y和x的函数表达式y=f(x)
六、3的方幂及不相等的3的方幂的和排列成递增序列1,3,4,9,10,12,13……,写出数列第300项
七、无向图G有20条边,有4个度为4的顶点,6个度为3的顶点,其他顶点度小于3,则G有多少个顶点
八、桶中有M个白球,小明每分钟从桶中随机取出一个球,涂成红色(不管白或红都涂红)再放回,问小明将桶中球所有涂红的指望时间是?
九、煤矿有3000吨煤要拿到市场上卖,有一辆火车能够用来运煤,火车最多能装1000吨煤,且火车自己须要烧煤作动力,每走1千米消耗1吨煤,如何运煤才能使得运到市场的煤最多,最可能是多少?
十、1,2,3,4…..n,n个数进栈,有多少种出栈顺序,写出递推公式(写出通项公式不得分)
十一、宇宙飞船有100,000位的存储空间,其中有一位有故障,现有一种Agent能够用来检测故障,每一个Agent能够同时测试任意个位数,若都没有故障,则返回OK,如有一位有故障,则失去响应。若是有无限多个Agent可供使用,每一个Agent进行一次检测须要耗费1小时,如今有2个小时时间去找出故障位,问最少使用多少个Agent就能找出故障。
(总共12道填空题,还有一道太复杂,题目很长,还有示意图,这里没有记录下来)
大题:
一、n个数,找出其中最小的k个数,写出代码,要求最坏状况下的时间复杂度不能高于O(n logk)
二、写程序输出8皇后问题的全部排列,要求使用非递归的深度优先遍历
三、有n个做业,a1,a2…..an,做业aj的处理时间为tj,产生的效益为pj,最后完成期限为dj,做业一旦被调度则不能中断,若是做业aj在dj前完成,则得到效益pj,不然无效益。给出最大化效益的做业调度算法。点评:参考答案请看这个连接:http://www.51nod.com/question/index.html#!questionId=645。
- 有道的一个笔试题,1-9,9个数组成三个三位数,且都是彻底平方数(三个三位数 占据 9个数)求解法。
点评@林晚枫&归云见鸿:
(a*10+b)(a*10+b)
100a^2+20ab+b^2
a 属于 [1,2,3]
a=3,b=1 31 961,
a=2,b=3 23 529 400+40b+b^2
25 625
27 729
28 784
29 841
a=1,b=3 13 169 100+20b+b^2
14 196
16 256
17 289
18 324
19 361
=>最终惟一解 529 784 361
具体代码以下(3个for循环,而后hash):
- 9月28日,大众点评北京笔试题目:
1.一个是跳台阶问题,能够1次一级,1次两级,1次三级,求N级的跳法一共多少种?
点评:老题,参考答案请见:http://blog.csdn.net/v_july_v/article/details/6879101。
2.一个文件有N个单词,每行一个,其中一个单词出现的次数大于N/2,怎么样才能快速找出这个单词?
点评:仍是老题,参见:http://blog.csdn.net/v_july_v/article/details/6890054。
大众点评前面还有30道逻辑题,15道文字推理,15道数学推理,一共只给20min。
- 9月28日,网易笔试题:
一、英雄升级,从0级升到1级,几率100%。
从1级升到2级,有1/3的可能成功;1/3的可能停留原级;1/3的可能降低到0级;
从2级升到3级,有1/9的可能成功;4/9的可能停留原级;4/9的可能降低到1级。
每次升级要花费一个宝石,无论成功仍是停留仍是降级。
求英雄从0级升到3级平均花费的宝石数目。
点评:题目的意思是,从第n级升级到第n+1级成功的几率是(1/3)^n(指数),停留原级和降级的几率同样,都为[1-(1/3)^n]/2)。
二、将一个很长的字符串,分割成一段一段的子字符串,子字符串都是回文字符串。
有回文字符串就输出最长的,没有回文就输出一个一个的字符。
例如:
habbafgh
输出h,abba,f,g,h。
点评:编程艺术第十五章有这个回文问题的解答,参见:http://blog.csdn.net/v_july_v/article/details/6712171。此外,通常的人会想到用后缀数组来解决这个问题,其他更多的方法请见:http://dsqiu.iteye.com/blog/1688736。最后,还能够看下这个连接:http://www.51nod.com/question/index.html#!questionId=672。
- 10月9日,腾讯一面试题:
有一个log文件,里面记录的格式为:
QQ号: 时间: flag:
如123456 14:00:00 0
123457 14:00:01 1
其中flag=0表示登陆 flag=1表示退出
问:统计一天平均在线的QQ数。
点评:相似于此文中:http://blog.csdn.net/hackbuteer1/article/details/7348968,第8题后的腾讯面试题,读者能够参看之。
- 10月9日,腾讯面试题:
1.有一亿个数,输入一个数,找出与它编辑距离在3之内的书,好比输入6(0110),找出0010等数,数是32位的。
2.每一个城市的IP段是固定的,新来一个IP,找出它是哪一个城市的,设计一个后台系统。
- 10月9日,YY笔试题:
1 输出一个字符串中没有重复的字符。如“baaca”输出“bac”。
2 对于一个多叉树,设计TreeNode节点和函数,返回先序遍历状况下的下一个节点。
函数定义为TreeNode* NextNode(TreeNode* node)
3 分割字符串。
对于一个字符串,根据分隔符seperator,把字符串分割,若是存在多个分隔符连在一块儿,则当作一个分隔符。若是分隔符出如今" "符号之间,则不须要分割" "之间的字符。
好比a++abc ,分隔符为+,输出a abc
a+"hu+" 输出a hu+
a++"HU+JI 输出a "HU JI。
请根据上述需求完成函数:void spiltString(string aString,char aSeperator)。
- 10月9日,赶集网笔试

- 10月9日,阿里巴巴2013校园招聘全套笔试题(注:下图中所标答案不表明标准答案,有问题,欢迎留言评论)



上述第15题,填空:lower+ (upper-lower)/2
lower mid upper
0 6 12
7 9 12
7 7 8
8 8 8
比较4次
上述第16题,解答以下图所示:

上述第17题,解答以下图所示:

1八、甲包8个红球 2个蓝球,乙包2个红球 8个蓝球。抛硬币决定从哪一个包取球,取了11次,7红4蓝。注,每次取后还放进去,只抛一次硬币。问选的是甲包的几率?
点评:
贝叶斯公式 + 全几率公式做答(参看连接:http://www.doc88.com/p-132711202556.html)。具体解答以下图所示:

注:上述第15~18的解答所有来自读者Lei Lei来信给出的解答,他的博客地址是:http://blog.csdn.net/nwpulei,特此感谢。有任何问题,欢迎随时讨论&指正,同时,更欢迎其余朋友也一块儿来作这些题目(你的答案一经选用,我能够根据你的要求,贴出你的我的主页或微博地址或博客地址)。
1九、已知一个n个元素的数组,第i个元素在排序后的位置在[i-k,i+k]区间,k<<n .让你设计一个算法对数组排序,要求时间复杂度最小,O (nlogn)不得分,O(nk)得2分,以下图所示:


读者twtsa毛遂自荐,这是他给出的上述第19~20题的我的题解:http://blog.csdn.net/twtsa/article/details/8055143。有任何问题,欢迎随时讨论&指正。
- 10月10日,暴风影音笔试:
都是很是基础的题目,这是其中一道:一个整数转换成二进制后,问里面有多少个1。
- 10月10日,2013亚马逊在线笔试题目
题目及参考答案请见这:http://blog.chinaunix.net/uid-26750075-id-3370694.html。(感谢读者freeloki来信提供)。
-
10月10日人人网面试题
第一面:
一、(1)++i 和 i++,那个效率高?
(2)++++i,i++++,哪一个是合法的?
(3)实现int型的++i 和 i++操做。
二、一段程序,求输出。(考察静态变量和模版类)
- int g = 0;
- template<typename T>
- class B
- {
- public:
- int static fun()
- {
- static int value = ++g;
- return value;
- }
- };
-
- int main()
- {
- cout << B<int>::fun() << endl;
- cout << B<char>::fun() << endl;
- cout << B<float>::fun() << endl;
- cout << B<int>::fun() << endl;
- cout << B<long>::fun() << endl;
- return 0;
- }
三、(1)实现二进制转十进制。
(2)若是有下面这种能直接求二进制转十进制的代码,是怎么实现的?
binary<1>::value; // 结果为1
binary<11>::value; // 结果为3
四、volatile、explicit、mutable表示的含义。
五、求整形数组的一个子数组,使得该子数组全部元素的和的绝对值最大。
六、(1)写求单链表是否有环的算法。
(2)若是有环,如何找出环的第一个结点。
七、实现单例模式。
二面:
一、一个文本,一万行,每行一个词,统计出现频率最高的前10个词(词的平均长度为Len)。并分析时间复杂度。
二、求数组中最长递增子序列。
- 10月10日,网易2013校园招聘全套笔试题:







- 10月10日,网易,数据挖掘工程师:
1,简述你对数据与处理的认识;
2,简述你对中文分词的理解,说明主要难点和经常使用算法;
3,常见的分类算法有哪些;
4,简述K-MEANS算法;
5,设计一个智能的商品推荐系统;
6,简述你对观点挖掘的认识。
点评:其它题目与上述第56题第一部分(http://blog.csdn.net/hackbuteer1/article/details/8060917)所述相同。
- 10月11日,阿里巴巴笔试部分题目:
1. 甲乙两我的上街,捡到一张10块钱的购物卡,两人就想出一个办法来分配这张卡。两个分别将本身出的价格写在纸上,而后看谁出的价高就给谁,而且那个出价高的人要把出的钱给对方。如今甲有6块钱,乙有8块钱。问谁得到的钱多。(多选)
A 甲多 B 乙多 C 同样多 D 有可能出现有人赔钱的状况
2. 有一个怪物流落到一个荒岛上,荒岛上有n条鳄鱼。每条鳄鱼都有实力单独吃掉怪物。可是吃掉怪物是有风险的,会形成体力值降低,而后会有可能被掉其余鳄鱼吃。问,最后那个怪物是危险的仍是安全的?
3. 算法题:
A[i]是一个有序递增数组,其中全部的数字都不相等,请设计一种算法,求出其中全部的A[i]=i的数字并分析时间复杂度,不分析复杂度不得分。
4. 大题
你在浏览器中输入网址:http://blog.csdn.net/v_JULY_v,按下回车键后,会发生什么事情,请一一描述(20分)。包括浏览器,网络,服务器等等发生的事情,及各项关键技术。
点评:这样的题考过不少次,参考答案以下图所示:
- 10月11日,华为一面:
一、将一个普通的二叉树转换为二叉排序树?
二、随便写一个排序算法。
- 10月11日,完美笔试题:
1.为何析构函数应该设为虚函数
2.大数字乘法问题
3.双向链表模拟队列操做push pop find
4.求 a/3 不能用除法
5.多核下多线程同步问题,使用锁应该注意什么
6.三个宝箱有一个里面有珠宝,如今拿第一宝箱,而后打开第二个宝箱后发现没有珠宝,用几率论原理解释为何如今拿第三个宝箱,里面有珠宝的几率比拿第一个宝箱高。
- 10月11日,搜狐畅游旗下第七大道笔试题:
算法题
1.一个数是不是另外一个数的平方。
2.N进制换成M进制
3.设计一个大数乘法
综合题
1.N个数,出栈有几种状况
2.进程死锁缘由及条件.
- 腾迅一个很是有意思的面试题:
N个数组,每一个数组中的元素都是递增的顺序,如今要找出这N个数组中的公共元素部分,如何作? 注:不能用额外辅助空间。
点评:
讨论了半天:http://weibo.com/1580904460/z08mT0aFj,没个好的结果,发现仍是上午想到的N个指针逐步向后移动,辅以二分,而后N路归并更靠谱,相似这里的第5题所述的办法:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/17/2593224.html。若读者有更好的思路,欢迎赐教。
- 10月12日,迅雷2013校园招聘「广州站」C++方向全套笔试题
(注:若照片看不清楚,请右键点击“图片另存为”到桌面,而后再打开图片,即可以随意放大缩小图片拉)







- 10月12日晚,微策略北京站笔试题(根据读者回忆整理):
一、魔术定义:整数N以基数B表示,如21以基数3表示为210,那么21是基数3的一个魔术,210三个位的值都不同。设计函数,输入参数N和B(B介于2到10之间),返回是否为魔术。
二、斐波那契数列的变形,一个贼每次上楼梯1或者2,一个27层的楼梯须要多少种方法,记住贼不能通过5,8,13层,不然会被抓住。点评:仍是能够用斐波那契来推算,f(n) = f(n-1) + f(n-2),只是f(5) f(8) f(13) = 0,http://www.51nod.com/answer/index.html#!answerId=596。
三、给定一棵树根节点,每一个节点里面的值都不相同,查找iKEY的节点,并使用一个给定的节点将查找到的节点替换掉。节点内有两个孩子节点和一个父节点。
四、字符串数组S,全是0和1表示的,字符串都是n位的,且1的个数小于等于l,返回index的字符串。(这个比较奇怪,若是S中字符串都是符合1的个数小于等于l,则直接能够获得index的字符串啊,难道是要先求这个字符串数组?那就比较麻烦了)
五、降序排列的数组,找到其中两个不一样的值,其乘积最接近一个给定的值M,感受和加法求和很相似。
六、序列123...N,N介于3和9之间,在其中加入+-或者空格,使其和为0,
如123456 1-2 3-4 5+6 7 等价于1-23-45+67=0。请问,如何得到全部组合?
- 10月12日,大众点评笔试一题:

- 读者私信,昨日(12号)美团的笔试题:
一、一副扑克52张(去了大小王),洗牌,求最顶一张和最底一张是A的几率
二、知道两个数的异或以及这两个数的和,问能够肯定这对数吗?为何?给出推理过程
三、A、B两个文件各存50亿个商品名称,每一个50个字符,求这两个文件中相同名称的商品名,内存限制4G(看过您的《教你如何迅速秒杀掉:99%的海量数据处理面试题》中的第6题,无压力,很是感谢)
四、给一个二叉树的后序遍历和中序遍历,画出这颗二叉树,写出前序遍历结果,并给出推理过程
五、一个有序数组array,给一个数x,可重复,求这个数在array中出现的区间,算法思路和代码实现
六、一个映射文件中存了ip地址区间和城市名称,形如:
10.0.0.1 10.0.1.27 北京
10.0.2.1 10.0.2.27 北京
201.0.1.12 201.0.2.124 上海
给你一个ip地址,获取城市名称,要求:1)给出算法思想 2)代码实现。
- 10月12日晚,360 2013校招部分笔试题(注:图中所标答案不表明正确答案):

int main()
{
fork()||fork();
return 0;
}
问,上述程序建立了几个进程?

编程题、传教士人数m,野人c,m≥c,开始都在岸左边,
①船只能载两人,传教士和野人都会划船,固然必须有人划船
②两岸边保证野人人数不能大于传教士人数
把全部人都送过河,设计一方案,要求编程实现。
点评:
读者huangxy10于本文评论下第169楼提供了一种解法:http://blog.csdn.net/huangxy10/article/details/8066408。再附一个讨论帖子:http://topic.csdn.net/u/20121012/22/70226713-A669-4F03-80B7-BFFF12A330EB.html。
- 10月13日,百度2013校招北京站笔试题:
1、简答题(30分)
一、用简单语句描述数据库操做的步骤
二、写出TCP/IP的四层结构
三、什么是MVC结构,并描述各层结构的做用
2、算法与程序设计题(40分)
一、字母a-z,数字0-9,现须要其中任意3个做为密码,请输出全部可能组合。(伪码\C\C++\JAVA)(10分)
点评:如本文评论下第198楼所述,即从26+10=36个不一样字符中选取3个字符的组合,用递归及非递归两种方法,能够参照如下连接:
http://blog.csdn.net/wumuzi520/article/details/8087501(从n个数中选取m个数的组合数),主要代码以下:
- void Combination(int arr[], int nLen, int m, int out[], int outLen)
- {
- if(m == 0)
- {
- for (int j = 0; j < outLen; j++)
- {
- cout << out[j] << "\t";
- }
- cout << endl;
-
- return;
- }
-
- for (int i = nLen; i >= m; --i)
- {
- out[m-1] = arr[i-1];
- Combination(arr,i-1,m-1,out,outLen);
- }
- }
-
- void PrintCombination(int arr[], int nLen, int m)
- {
- int* out = new int[m];
- Combination(arr,nLen,m,out,m);
- delete [] out;
- }
二、实现字符串反转函数(10分)
三、给定字符函数a、插入 b、删除 c、替换
例如字符串A=acegf,字符串B=adef,最少须要2步操做将A转换为B,
即第一步将c替换为d,第二步将g删除;
(1)请问将字符串A=gumbo转换为字符串B=gambol,最少须要几步操做,列出如何操做(2分)
(2)任意字符串A和字符串B,如何计算最小操做次数,计算思路,并给出递归公式(3分)
(3)实现代码(注意代码风格与效率)(15分)
点评:请参看上文第38题第4小题:9月26日,百度一二面试题。
3、系统设计题(30分)
RSA SecurID安全系统
应用场景:这是一种用户登陆验证手段,例如银行登陆系统,这个设备显示6位数字,每60秒变一次,再通过服务器认证,经过则容许登陆。问How to design this system?
1)系统设计思路?服务器端为什么能有效认证动态密码的正确性?
2)若是是千万量级永固,给出系统设计图示或说明,要求子功能模块划分清晰,给出关键的数据结构或数据库表结构。
考虑用户量级的影响和扩展性,用户密码的随机性等,若是设计系统以支持这几个因素.
3)系统算法升级时,服务器端和设备端可能都要有所修改,如何设计系统,可以使得升级过程(包括可能的设备替换或重设)尽可能平滑?
- 10月13日,百度移动开发笔试题
1、 一、什么是RISC;
二、经过后序、中xu求前序
三、重写与重载的区别
2、
一、反转链表
二、判断两个数组中是否有相同的数字
三、1000瓶水中找 出有毒的那瓶,毒性一周后发做,一周内最少须要多少只老鼠
3、系统设计 email客户端,支持多帐户和pop3等协议
一、请写出可能的至少5个用例;
二、使用sqlite存储账户、已收信息、已发信息、附件、草稿,请设计合理的表结构
三、pop3等协议等接口已完成,请给出email客户端的模块设计图。
- 10月13日,人搜2013 校招北京站部分笔试题(读者回忆+照片):


1,二重歌德巴赫猜测
全部大于等于6的偶数均可以表示成两个(奇)素数之和。
给定1-10000,找到能够用两个素数之和表示每个偶数的两个素数,而后输出这两个素数,若是有多对,则只须要输出其中之一对便可。
要求:复杂度较低,代码可运行。
2,城市遍历
某人家住北京,想去青海玩,可能会通过许多城市,
现已知地图上的城市链接,求通过M个城市到达青海的路线种类。
城市能够屡次到达的,好比去了天津又回到北京,再去天津,即为3次。北京出发不算1次。
输入:
N M S
N为城市总数,北京为0,青海为N-1;
M为通过的城市数目;
S为以后有S行
i j
表示第i个城市能够去第j个城市,是有方向的。
输出:
N
表示路径种类。
3,分布式系统设计
有1000亿个URL,其中大约有5亿个site。天天的更新大约2%-5%。设计一个系统来解决存储和计算下面三个问题。可用分布式系统。
URL:http///site[port]*(key==?;key==?)
site:[*].domain
URL:http://www.baidu.com/baidu?word=%E5%AE%A3%E8%AE%B2%E4%BC%9A&ie=utf-8
site::www.baidu.com
domain::baidu.com
key=baidu?word
a>检测每一个域名下的site数目,以及每一个site下的URL数目,输出site变化超过必定阈值的域名以及URL数目变化剧烈的site。找出泛域。
泛域:该域下的site数目超过500个,且每一个site下的URL数目超过100个。
b>提取URL中key的特征,对site进行聚类;
(每一个site下面有多个URL,这些URL中有许多key,能够获取这些key做为site的特征,对site进行聚类,不过这应该是多机器联合的)
c>对于给定的domain,输出该domain下的全部site。
- 10月13日,创新工场笔试:
第一个,快排最坏状况下是O(n^2),问如何优化?
第二个,怎么样求一个数的根号
点评:你是否是会想到一系列有关数学的东西,什么泰勒级数啊,什么牛顿法啊,具体编程能够以下代码所示:
- static void Main(string[] args)
- {
- double k = 5;
- double n = 2, m = k;
-
- while (n != m)
- {
- m = k / n;
- n = (m + n) / 2;
- }
- }
连接:http://www.51nod.com/question/index.html#!questionId=660。
第三个,4个数字,用四则元素求结果可否为24。写出这个判断的函数。
- 10月14日,思科网讯旗下公司笔试题:
一、海量数据中,寻找最小的k个数。
请分状况,给出时间复杂度最优,或空间复杂度最优的方案,或时间复杂度/空间复杂度综合考虑的可行方案。
点评:参见:第三章、寻找最小的k个数。
二、有两座桥,其中一座多是坏的,两个守桥人分别守在这两座桥的入口。他们一个老是会说实话,一个老是说谎言。
你如今须要找出哪一座桥能够经过。
1),请问最少须要问守桥人几个问题,能够找出能够经过的桥?如何问?
2),请编程解决。
- 10月14日,腾讯杭州站笔试题:
一、http服务器会在用户访问某一个文件的时候,记录下该文件被访问的日志,网 站管理员都会去统计天天每文件被访问的次数。写一个小程序,来遍历整个日志 文件,计算出每一个文件被访问的访问次数
1)请问这个管理员设计这个算法
2)该网站管理员后来加入腾讯从事运维工做,在腾讯,单台http服务器不够用的 ,一样的内容,会分布在全国各地上百台服务器上。每台服务器上的日志数量, 都是以前的10倍之多,天天服务器的性能更好,以前他用的是单核cpu,如今用的 是8核的,管理员发如今这种的海量的分布式服务器,基本无法使用了,请从新设计一个算法。
二、腾讯的qq游戏当中,最多人玩的游戏就是斗地主了,每一句游戏开始时,服务 器端都要洗牌,以保证发牌的时每一个人拿的牌都是随机的,假设用1-54来表示54 张不一样的拍,请你写一个洗牌算法,保证54张牌能随机打散!
选择题:
1)、下列RAID技术没法提升可靠性的是:
A:RAID0 B:RAID1 C:RAID10 D:RAID5
2)、长度为1的线段,随机在其上选择两点,将线段分为三段,问这3个字段能组成一 个三角形的几率是:
1/2,1/3,1/4,1/8
3)、下面那种标记的包不会在三次握手的过程当中出现()
A:SYN B:PSH C:ACK D:RST
- 10月14日,搜狗2013 校招笔试题:
一、有n*n个格子,每一个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右,一共走两次(即从左上角走到右下角走两趟),把全部通过的格子的数加起来,求最大值SUM,且两次若是通过同一个格子,则最后总和SUM中该格子的计数只加一次。
点评:@西芹_new,一共搜(2n-2)步,每一步有四种走法,考虑不相交等条件能够剪去不少枝,代码以下「http://blog.csdn.net/huangxy10/article/details/8071242」:
- 西芹_new<huangxy10@qq.com> 0:55:40
-
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
-
- #define N 5
- int map[5][5]={
- {2,0,8,0,2},
- {0,0,0,0,0},
- {0,3,2,0,0},
- {0,0,0,0,0},
- {2,0,8,0,2}};
- int sumMax=0;
- int p1x=0;
- int p1y=0;
- int p2x=0;
- int p2y=0;
- int curMax=0;
-
- void dfs( int index){
- if( index == 2*N-2){
- if( curMax>sumMax)
- sumMax = curMax;
- return;
- }
-
- if( !(p1x==0 && p1y==0) && !(p2x==N-1 && p2y==N-1))
- {
- if( p1x>= p2x && p1y >= p2y )
- return;
- }
-
-
- if( p1x+1<N && p2x+1<N ){
- p1x++;p2x++;
- int sum = map[p1x][p1y]+map[p2x][p2y];
- curMax += sum;
- dfs(index+1);
- curMax -= sum;
- p1x--;p2x--;
- }
-
-
- if( p1y+1<N && p2y+1<N ){
- p1y++;p2y++;
- int sum = map[p1x][p1y]+map[p2x][p2y];
- curMax += sum;
- dfs(index+1);
- curMax -= sum;
- p1y--;p2y--;
- }
-
-
- if( p1x+1<N && p2y+1<N ) {
- p1x++;p2y++;
- int sum = map[p1x][p1y]+map[p2x][p2y];
- curMax += sum;
- dfs(index+1);
- curMax -= sum;
- p1x--;p2y--;
- }
-
-
- if( p1y+1<N && p2x+1<N ) {
- p1y++;p2x++;
- int sum = map[p1x][p1y]+map[p2x][p2y];
- curMax += sum;
- dfs(index+1);
- curMax -= sum;
- p1y--;p2x--;
- }
- }
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- curMax = map[0][0];
- dfs(0);
- cout <<sumMax-map[N-1][N-1]<<endl;
- return 0;
- }
@绿色夹克衫:跟这个问题:http://www.51nod.com/question/index.html#!questionId=487 ,是同一个问题。
1、用动态规划能够求解,大概思路就是同时DP 2次所走的状态。先来分析一下这个问题,为了方便讨论,先对矩阵作一个编号,且以5*5的矩阵为例(给这个矩阵起个名字叫M1):
M1
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
从左上(0)走到右下(8)共须要走8步(2*5-2)。为了方便讨论,咱们设所走的步数为s。由于限定了只能向右和向下走,所以不管如何走,通过8步后(s = 8)都将走到右下。而DP的状态也是依据所走的步数来记录的。
再来分析一下通过其余s步后所处的位置,根据上面的讨论,能够知道通过8步后,必定处于右下角(8),那么通过5步后(s = 5),确定会处于编号为5的位置。3步后确定处于编号为3的位置......。s = 4的时候,处于编号为4的位置,对于方格中,共有5(至关于n)个不一样的位置,也是全部编号中最多的。推广来讲n*n的方格,总共须要走2n - 2步,当s = n - 1时,编号为n个,也是编号最多的。
若是用DP[s,i,j]来记录2次所走的状态得到的最大值,其中s表示走s步,i表示s步后第1次走所处的位置,j表示s步后第2次走所处的位置。
为了方便讨论,再对矩阵作一个编号(给这个矩阵起个名字叫M2):
M2
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
M1
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
通过6步后,确定处于M1中编号为6的位置。共有3个编号为6的,分别对应M2中的2 3 4。假设第1次通过6步走到了M2中的2,第2次通过6步走到了M2中的4,DP[s,i,j] 则对应 DP[6,2,4]。因为s = 2n - 2,0 <= i<= <= j <= n,因此这个DP共有O(n^3)个状态。
M1
0 1 2 3 4
1 2 3 4 5
2 3 4 5
6
3 4 5
6 7
4 5 6 7 8
再来分析一下状态转移,以DP[6,2,3]为例(就是上面M1中加粗的部分),能够到达DP[6,2,3]的状态包括DP[5,1,2],DP[5,1,3],DP[5,2,2],DP[5,2,3],加粗表示位置DP[5,1,2] DP[5,1,3] DP[5,2,2] DP[5,2,3] (加红表示要达到的状态DP[6,2,3])
0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
1 2 3 4
5 1 2 3 4
5 1 2 3 4 5 1 2 3 4 5
2 3 4
5 6 2 3 4 5 6 2 3 4
5 6 2 3 4
5 6
3 4 5 6 7 3 4
5 6 7 3 4 5 6 7 3 4
5 6 7
4 5 6 7 8 4 5 6 7 8 4 5 6 7 8 4 5 6 7 8
所以,DP[6,2,3] = Max(DP[5,1,2] ,DP[5,1,3],DP[5,2,2],DP[5,2,3]) + 6,2和6,3格子中对应的数值 (式一)
二、上面(式一)所示的这个递推看起来没有涉及:“若是两次通过同一个格子,那么该数只加一次的这个条件”,讨论这个条件须要换一个例子,以DP[6,2,2]为例。
DP[6,2,2]能够由DP[5,1,1],DP[5,1,2],DP[5,2,2]到达,但因为i = j,也就是2次走到同一个格子,那么数值只能加1次。
因此当i = j时,DP[6,2,2] = Max(DP[5,1,1],DP[5,1,2],DP[5,2,2]) + 6,2格子中对应的数值 (式二)
三、故,综合上述的(式一),(式二)最后的递推式就是
if(i != j)
DP[s, i ,j] = Max(DP[s - 1, i - 1, j - 1], DP[s - 1, i - 1, j], DP[s - 1, i, j - 1], DP[s - 1, i, j]) + W[s,i] + W[s,j]
else
DP[s, i ,j] = Max(DP[s - 1, i - 1, j - 1], DP[s - 1, i - 1, j], DP[s - 1, i, j]) + W[s,i]
其中W[s,i]表示通过s步后,处于i位置,位置i对应的方格中的数字。
复杂度分析:状态转移最多须要统计4个变量的状况,看作是O(1)的。共有O(n^3)个状态,因此总的时间复杂度是O(n^3)的。空间上能够利用滚动数组优化,因为每一步的递推只跟上1步的状况有关,所以能够循环利用数组,将空间复杂度降为O(n^2)。
二、N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得能够从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.
若是是:
1,N<=16,要求K<=16*N.
2,N<=16,要求K<=10*N.
3,N<=64,要求K<=15*N.
点评:http://www.51nod.com/question/index.html#!questionId=659。
- 人人网面试,只面一道题,要求5分钟出思路,10分钟出代码
面试题是:
两个无序数组分别叫A和B,长度分别是m和n,求中位数,要求时间复杂度O(m+n),空间复杂度O(1) 。
-
10月15日,网新恒天笔试题
1.不要使用库函数,写出void *memcpy(void *dst, const void *src, size_t count),其中dst是目标地址,src是源地址。
点评:下面是nwpulei写的代码:
- void* memcpy(void *dst, const void *src, size_t count)
- {
- assert(dst != NULL);
- assert(src != NULL);
- unsigned char *pdst = (unsigned char *)dst;
- const unsigned char *psrc = (const unsigned char *)src;
-
- assert(!(psrc<=pdst && pdst<psrc+count));
- assert(!(pdst<=psrc && psrc<pdst+count));
-
- while(count--)
- {
- *pdst = *psrc;
- pdst++;
- psrc++;
- }
- return dst;
- }
连接:http://blog.csdn.net/nwpulei/article/details/8090136。
2.给定一个字符串,统计一下哪一个字符出现次数最大。
3.咱们不知道Object类型的变量里面会出现什么内容,请写个函数把Object类型转换为int类型。
- 10月15日,Google 2013 校招全套笔试题:





1.写一个函数,输出前N个素数,函数原型:void print_prime(int N); 不须要考虑整数的溢出问题,也不须要使用大数处理算法。
2.长度为N的数组乱序存放着0带N-1.如今只能进行0与其余数的swap操做,请设计并实现排序,必须经过交换实现排序。
3.给定一个源串和目标串,可以对源串进行以下操做:
1.在给定位置上插入一个字符
2.替换任意字符
3.删除任意字符
写一个程序,返回最小操做数,使得对源串进行这些操做后等于目标串,源串和目标串的长度都小于2000。
点评:
一、此题反复出现,如上文第38题第4小题9月26日百度一二面试题,10月9日腾讯面试题第1小题,及上面第69题10月13日百度2013校招北京站笔试题第二大道题第3小题,同时,还能够看下这个连接:http://www.51nod.com/question/index.html#!questionId=662。
-
- f[i,j] = min { f[i-1,j]+1, f[i,j-1]+1, f[i-1,j-1]+(s[i]==t[j]?0:1) }
-
二、补充:上述问题相似于编程之美上的下述一题「如下内容摘自编程之美第3.3节」:
许多程序会大量使用字符串。对于不一样的字符串,咱们但愿可以有办法判断其类似程度。咱们定义了一套操做方法来把两个不相同的字符串变得相同,具体的操做方法为:
1. 修改一个字符(如把“a”替换为“b”);
2. 增长一个字符(如把“abdd ”变为“aebdd ”);
3. 删除一个字符(如把“travelling”变为“traveling”)。
好比,对于“abcdefg”和“abcdef ”两个字符串来讲,咱们认为能够经过增长/减小一个“g”的方式来达到目的。上面的两种方案,都仅须要一次操做。把这个操做所须要的次数定义为两个字符串的距离,而类似度等于“距离+1”的倒数。也就是说,“abcdefg”和“abcdef”的距离为1,类似度为1 / 2 = 0.5。
给定任意两个字符串,你是否能写出一个算法来计算出它们的类似度呢?
这样,很快就能够完成一个递归程序,以下所示:
- Int CalculateStringDistance(string strA, int pABegin, int pAEnd,
- string strB, int pBBegin, int pBEnd)
- {
- if(pABegin > pAEnd)
- {
- if(pBBegin > pBEnd)
- return 0;
- else
-
- return pBEnd – pBBegin + 1;
- }
-
- if(pBBegin > pBEnd)
- {
- if(pABegin > pAEnd)
- return 0;
- else
- return pAEnd – pABegin + 1;
- }
-
- if(strA[pABegin] == strB[pBBegin])
- {
- return CalculateStringDistance(strA, pABegin + 1, pAEnd,
- strB, pBBegin + 1, pBEnd);
- }
- else
- {
- int t1 = CalculateStringDistance(strA, pABegin, pAEnd, strB,
- pBBegin + 1, pBEnd);
- int t2 = CalculateStringDistance(strA, pABegin + 1, pAEnd,
- strB,pBBegin, pBEnd);
- int t3 = CalculateStringDistance(strA, pABegin + 1, pAEnd,
- strB,pBBegin + 1, pBEnd);
- return minValue(t1,t2,t3) + 1;
- }
- }
上面的递归程序,有什么地方须要改进呢?在递归的过程当中,有些数据被重复计算了。好比,若是开始咱们调用CalculateStringDistance(strA,1, 2, strB, 1, 2),下图是部分展开的递归调用。

能够看到,圈中的两个子问题被重复计算了。为了不这种没必要要的重复计算,能够把子问题计算后的解存储起来。如何修改递归程序呢?仍是DP!请看此连接:http://www.cnblogs.com/yujunyong/articles/2004724.html。
三、此外,关于这个“编辑距离”问题的应用:搜索引擎关键字查询中拼写错误的提示,能够看下这篇文章:http://www.ruanyifeng.com/blog/2012/10/spelling_corrector.html。「关于什么是“编辑距离”:一个快速、高效的Levenshtein算法实现,这个是计算两个字符串的算法,Levenshtein距离又称为“编辑距离”,是指两个字符串之间,由一个转换成另外一个所需的最少编辑操做次数。固然,次数越小越类似。这里有一个BT树的数据结构,挺有意思的:http://blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Trees」
最后,Lucene中也有这个算法的实现(我想,通常的搜索引擎通常都应该会有此项拼写错误检查功能的实现):http://www.bjwilly.com/archives/395.html。
四、扩展:面试官还能够继续问下去:那么,请问,如何设计一个比较两篇文章类似性的算法?(这个问题的讨论能够看看这里:http://t.cn/zl82CAH)
BTW,群友braveheart89也整理了这套笔试题:http://blog.csdn.net/braveheart89/article/details/8074657。
- 10月16日,UC的笔试题目:
一、有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},但愿排序后{a1,b1,a2,b2,....,an,bn},要求时间复杂度o(n),空间复杂度0(1)。
点评:@绿色夹克衫:完美洗牌问题「关于洗牌算法:http://blog.csdn.net/gogdizzy/article/details/4917488」,解决这个问题的关键在于如何解决置换群中的环。方法是微软员工那篇论文中写的:http://user.qzone.qq.com/414353346/blog/1243343118#!app=2&via=QZ.HashRefresh&pos=1243343118,大概意思是,用3的幂来弄:
@方程:
- int index = arr.length / 2;
- int temp = arr[index];
- while(index != 1){
- int tempIndex = (index + (index % 2) * (arr.length - 1)) / 2;
- arr[index] = arr[tempIndex];
- index = tempIndex;
- }
- arr[1] = temp;
连接:1,http://www.51nod.com/question/index.html#!questionId=278;二、这里也有一参考答案:http://blog.csdn.net/yuan8080/article/details/5705567。
- 10月17日,创新工场电话面试:
1,如何删除一个搜索二叉树的结点;
2,如何找到一个数组中的两个数,他们的和为0;
3,如何判断两条二维平面上的线段是否相交。
- 网易2013 校招笔试题:




- 10月19日,百度研发三面题:
百度地图里的路线查询:给定两个站点,若是没有直达的路线,如何找到换乘次数最少的路线?
点评:蚂蚁算法?仍是广搜,或A*算法?
- 10月20日,baidu广州站笔试算法题:
1. 有一箱苹果,3个一包还剩2个,5个一包还剩3个,7个一包还剩2个,求N个知足以上条件的苹果个数。
2. 用递归算法写一个函数,求字符串最长连续字符的长度,好比aaaabbcc的长度为4,aabb的长度为2,ab的长度为1。
3. 假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,如今该数组分红若干段,每一个段的数据长度小于20「也就是说:题目并无说每段数据的size 相同,只是说每一个段的 size < 20 而已」,而后将每段的数据进行乱序(即:段内数据乱序),造成一个新数组。请写一个算法,将全部数据从小到大进行排序,并说明时间复杂度。
点评:
思路1、如@四万万网友所说:维护一个20个元素大小的小根堆,而后排序,每次pop取出小根堆上最小的一个元素(log20),而后继续遍历原始数组后续的(N-20)个元素,总共pop (N-20)次20个元素小根堆的log20的调整操做。
思路二@飘零虾、若是原数组是a[],那么a[i+20]>=a[i]恒成立(由于每段乱序区间都是小于20的,那么向后取20,必然是更大的区间的元素)。
第一个数组:取第0、20、40、60、80...
第二个数组:取第一、2一、4一、6一、81...
...
第20个数组:取第1九、3九、5九、79... (上述每一个数组100亿/20 个元素)
共计20个数组,每一个数组100亿/20 个元素「注:这5亿个元素已经有序,不须要再排序」,且这20个数组都是有序的,而后对这20个数组进行归并,每次归并20个元素。时间复杂度跟上述思路一同样,也是N*logK(N=100亿,K=20)。
此外,读者@木叶漂舟直接按每组20个排序,将排好的20个与前20个调整拼接,调整两端接头处的元素,写了个简单地demo: http://t.cn/zlELAzs。不过,复杂度有点高,目前来讲中规中矩的思路仍是如上文中@四万万网友 所说思路一「@张玮-marihees按照思路一:http://weibo.com/1580904460/z1v5jxJ9P,写了一份代码:http://codepad.org/T5jIUFPG,欢迎查看」。
- 10月21日,完美笔试算法题「同时,祝本身生日快乐!」:
1. 请设计一个算法,当给出在2D平面中某个三角形ABC的顶点坐标时能输出位于该三角形内的一个随机点(须要知足三角形内均匀随机),无需写出实现,只要能清楚地描述算法便可。
2. 请本身用双向链表实现一个队列,队列里节点内存的值为int,要求实现入队,出队和查找指定节点的三个功能。
3. 实现一个无符号任意大整数的类,实现两个无符号超大整数的乘法。
- 10月22日,CSR掌微电子笔试题:
5.给定两个字符串s1和s2,要求断定s2是否可以被经过s1作循环移位(rotate)获得字符串包含。例如,S1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false。用伪代码或流程图叙述解法。
点评:老题,相似:http://blog.csdn.net/v_JULY_v/article/details/6322882。其他题目见:http://blog.sina.com.cn/s/blog_3eb9f72801016llt.html。
- 10月23日,去哪儿网笔试:
1.将IPV4转换成整数
2.定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);
点评:这是2010年整理的微软100题的第2题,http://blog.csdn.net/v_JULY_v/article/details/6057286,答案见此文第2题:http://blog.csdn.net/v_JULY_v/article/details/6126406。
3.数组a[n]里存有1到n的全部树,除了一个数removed,找出这个missing的树。
4.找出字符串中的最长子串,要求子串不含重复字符,并分析时间复杂度。
-
10月28日,微软三面题「顺祝,老妈明天生日快乐!」:
找一个点集中与给定点距离最近的点,同时,给定的二维点集都是固定的,查询可能有不少次,时间复杂度O(n)没法接受,请设计数据结构和相应的算法。
相似于@陈利人:附近地点搜索,就是搜索用户附近有哪些地点。随着GPS和带有GPS功能的移动设备的普及,附近地点搜索也变得煊赫一时。在庞大的地理数据库中搜索地点,索引是很重要的。可是,咱们的需求是搜索附近地点,例如,坐标(39.91, 116.37)附近500米内有什么餐馆,那么让你来设计,该怎么作?
点评:R树「从B树、B+树、B*树谈到R 树」仍是KD树「从K近邻算法、距离度量谈到KD树、SIFT+BBF算法」?
- 11月10日,百度笔试题:
一、20个排序好的数组,每一个数组500个数,按照降序排序好的,让找出500个最大的数。
二、一在线推送服务,同时为10万个用户提供服务,对于每一个用户服务从10万首歌的曲库中为他们随机选择一首,同一用户不能推送重复的,设计方案,内存尽量小,写出数据结构与算法。
-
从今天开始,在继续整理笔试面试题的同时,将整理上面已经收录的一系列笔试面试题的答案,欢迎诸君与我共同讨论.思考.作之「参与的方式为:你除了能够直接评论在本文之下,你也能够经过邮件:zhoulei0907@yahoo.cn或私信:http://weibo.com/julyweibo 给我,或本身写一篇博文把连接发给我收录,无任何语言限制」2012.10.19...
注意:
请全部凡是已经在本文评论下show 出了你的代码code(含思路)的朋友:「10.13日以前第一批:zhutou100hao,zzran,yuankangjian_2,caopengcs,iamzhaiwei,milo_zhang_bs, tpm0513, huangxy10,宇智波鼬,sos-phoenix,aini201,aini201,xsfrank,zz198808 ,Dracula777,li850221,ghostjay0216,a81895898,donghang0535, iamzhaiwei,fengchaokobe,umissmesomuch,believe3,aini201, liuliuliu11,qichi_bj」+ 「10月13日之后第2批: 杜,litaoye,smilearchery,jiadong1125,nwpulei,wumuzi520,..,尽快发“ID号+你在本文评论下作的题目的题号”到我邮箱「zhoulei0907@yahoo.cn」或者联系QQ:786 165 179,我会在尽快发给你 十五个经典算法研究的 可自行编辑修改的WORD文档,或者直接转发加群下载获得:http://weibo.com/1580904460/z4fqHcWDV,欢迎各位及其余朋友们继续参与,感谢诸位。
本文评论下的全部代码未经仔细验证,若是读者发现其中任何问题或错误,欢迎指正,经验证后,我也会给你发送文档,其余此前经过私信或邮件或QQ发过我题目或答案的朋友们如若须要也请发邮件:“名字+ 原文中的题号” 给我以便传送文档。July、二零一二年十月十六日。
后记
通过上面这么多笔试面试题目的了解,你自会看到,除了少部分特别难的算法题,大部分都是考察的基础,故校招笔试面试的关键是你的80%的
基础知识和编程实践能力 + 20%的算法能力(特别强调算法能力的则此项比例加大)。
OK,以上的一切都是我喜欢且我乐意作的,我愿同各位朋友享受这一切.(若是你身边有正在参加校招/笔试/面试的朋友,欢迎把此文转给他/她,举手之劳,助人无限),谢谢。July,二零一二年九月。
updated
近期九月十月的笔试面试题已经整理的差很少了,10月也即将过去,衷心祝愿各位都能拿到满意的offer,固然,若还能与我分享你的快乐,则再高兴不过了!
分享几点体会:
- 编码能力是你之后干任何开发工做的基础,刚开始时不要去纠结是否该去学算法,如果想干开发,多coding就是了(如今,就把你的代码评论到本文之下吧)!
- 找到你的兴趣和热爱之所在,它们会为你指导一切!我搞研究即是瞎弄,几乎没有任何什么学习方法,一切彻底凭借兴趣和热爱!当你慢慢开始有独立思考的意识时,你就知道一切该如何下手了!
原文地址:http://blog.csdn.net/v_july_v/article/details/7974418