十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦(第271-330题)
引言
此文十月百度,阿里巴巴,迅雷搜狗最新面试十一题已经整理了最新的面试题70道,本文依次整理腾讯,网易游戏,百度等各大公司最新校园招聘的笔试题,后续将继续整理十月下旬的笔/面试题。
腾讯2011.10.15校园招聘会笔试题
1、下面的排序算法中,初始数据集的排列顺序对算法的性能无影响的是(B)
A、插入排序 B、堆排序 C、冒泡排序 D、快速排序
2、以下关于Cache的叙述中,正确的是(B)
A、CPU中的Cache容量应大于CPU之外的Cache容量
B、Cache的设计思想是在合理成本下提高命中率
C、Cache的设计目标是容量尽可能与主存容量相等
D、在容量确定的情况下,替换算法的时间复杂度是影响Cache命中率的关键因素
3、数据存储在磁盘上的排列方式会影响I/O服务的性能,一个圆环的磁道上有10个物理块,10个数据记录R1------R10存放在这个磁道上,记录的安排顺序如下表所示:
物理块 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
逻辑记录 |
R1 |
R2 |
R3 |
R4 |
R5 |
R6 |
R7 |
R8 |
R9 |
R10 |
假设磁盘的旋转速度为20ms/周,磁盘当前处在R1的开头处,若系统顺序扫描后将数据放入单缓冲区内,处理数据的时间为4ms(然后再读取下个记录),则处理这10个记录的最长时间为(C)
A、180ms B、200ms C、204ms D、220ms
4、随着IP网络的发展,为了节省可分配的注册IP地址,有一些地址被拿出来用于私有IP地址,以下不属于私有IP地址范围的是(C)(私网IP地址:10.0.0.0- 10.255.255.255;172.16.0.0- 172.31.255.255;192.168.0.0-192.168.255.255。故选C)
A、10.6.207.84 B、172.23.30.28 C、172.32.50.80 D、192.168.1.100
5、下列关于一个类的静态成员的描述中,不正确的是(D)
A、该类的对象共享其静态成员变量的值 B、静态成员变量可被该类的所有方法访问
C、该类的静态方法只能访问该类的静态成员变量 D、该类的静态数据成员变量的值不可修改
6、已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key) = key%7计算散列地址,并散列存储在散列表A【0....6】中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为(C)
A、1.5 B、1.7 C、2.0 D、2.3
依次进行取模运算求出哈希地址:
A |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
记录 |
63 |
48 |
|
38 |
25 |
74 |
52 |
查找次数 |
1 |
3 |
|
1 |
1 |
2 |
4 |
74应该放在下标为4的位置,由于25已经放在这个地方,所以74往后移动,放在了下标为5的位置上了。
由于是等概率查找,所以结果为:1/6*(1+3+1+1+2+4)= 2.0
7、表达式“X=A+B*(C--D)/E”的后缀表示形式可以为(C)
A、XAB+CDE/-*= B、XA+BC-DE/*= C、XABCD-*E/+= D、XABCDE+*/=
8、(B)设计模式将抽象部分与它的实现部分相分离。
A、Singleton(单例) B、 Bridge(桥接)
C、 Composite(组合) D、 Facade(外观)
9、下面程序的输出结果为多少?
- void Func(char str_arg[100])
- {
- printf("%d\n",sizeof(str_arg));
- }
- int main(void)
- {
- char str[]="Hello";
- printf("%d\n",sizeof(str));
- printf("%d\n",strlen(str));
- char *p = str;
- printf("%d\n",sizeof(p));
- Func(str);
- }
输出结果为:6 5 4 4
对字符串进行sizeof操作的时候,会把字符串的结束符“\0”计算进去的,进行strlen操作求字符串的长度的时候,不计算\0的。
数组作为函数参数传递的时候,已经退化为指针了,Func函数的参数str_arg只是表示一个指针,那个100不起任何作用的。
10、下面程序的输出结果为多少?
- void Func(char str_arg[2])
- {
- int m = sizeof(str_arg); //指针的大小为4
- int n = strlen(str_arg); //对数组求长度,str_arg后面的那个2没有任何意义,数组已经退化为指针了
- printf("%d\n",m);
- printf("%d\n",n);
- }
- int main(void)
- {
- char str[]="Hello";
- Func(str);
- }
输出结果为: 4 5
strlen只是对传递给Func函数的那个字符串求长度,跟str_arg中的那个2是没有任何关系的,即使把2改为200也是不影响输出结果的。。
11、到商店里买200的商品返还100优惠券(可以在本商店代替现金)。请问实际上折扣是多少?
算法编程题:
1、给定一个字符串,求出其最长的重复子串。
思路:使用后缀数组,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分。
这样的时间复杂度为:
生成后缀数组 O(N)
排序 O(NlogN*N) 最后面的 N 是因为字符串比较也是 O(N)
依次检测相邻的两个字符串 O(N * N)
总的时间复杂度是 O(N^2*logN),
1、对于一个内存地址是32位、内存页是8KB的系统。0X0005F123这个地址的页号与页内偏移分别是多少。
2、如果X大于0并小于65536,用移位法计算X乘以255的值为:-X+X<<8
X<<8-X是不对的,X<<8,已经把X的值改变了(订正:X<<8是个临时变量,不会改变X的值,就像a+1不会改变a一样)。
3、一个包含n个节点的四叉树,每个节点都有四个指向孩子节点的指针,这4n个指针中有 3n+1 个空指针。
4、以下两个语句的区别是:
- int *p1 = new int[10];
- int *p2 = new int[10]();
5、计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是,大端模式:0X12 小端模式:0X56 X86结构的计算机使用 小端 模式。
一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是小端模式的。少部分,如MAC OS,是大端模式 的。
6、在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,请声明一个参数为int *,返回值为int的函数指针:
int (*fun)(int *)
7、在一冒险游戏里,你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问:
(1)恰好第K次(1=<K<=N)打开宝箱的概率是多少。
(2)平均需要尝试多少次。
一、算法设计
1、设rand(s,t)返回[s,t]之间的随机小数,利用该函数在一个半径为R的圆内找随机n个点,并给出时间复杂度分析。
2、为分析用户行为,系统常需存储用户的一些query,但因query非常多,故系统不能全存,设系统每天只存m个query,现设计一个算法,对用户请求的query进行随机选择m个,请给一个方案,使得每个query被抽中的概率相等,并分析之,注意:不到最后一刻,并不知用户的总请求量。
3、C++ STL中vector的相关问题:
(1)、调用push_back时,其内部的内存分配是如何进行的?
(2)、调用clear时,内部是如何具体实现的?若想将其内存释放,该如何操作?
二、系统设计
正常用户端每分钟最多发一个请求至服务端,服务端需做一个异常客户端行为的过滤系统,设服务器在某一刻收到客户端A的一个请求,则1分钟内的客户端任何其它请求都需要被过滤,现知每一客户端都有一个IPv6地址可作为其ID,客户端个数太多,以至于无法全部放到单台服务器的内存hash表中,现需简单设计一个系统,使用支持高效的过滤,可使用多台机器,但要求使用的机器越少越好,请将关键的设计和思想用图表和代码表现出来。
如p([1,2,3])输出:
[123]、[132]、[213]、[231]、[321]、[323]
求一个组合函数
如p([1,2,3])输出:
[1]、[2]、[3]、[1,2]、[2,3]、[1,3]、[1,2,3]
迅雷2011.10.21笔试题
knuth(int n, int m)
{
srand((unsigned int)time(0));
for (int i=0; i<n; i++)
{
if ( )
{
cout<<i<<endl;
;
}
}
}
分别为:rand()%(n-i)<m 和 m--;
2、以下prim函数的功能是分解质因数。请填空
void prim(int m, int n)
{
if (m>n)
{
while ( ) n++;
;
prim(m,n);
cout<<n<<endl;
}
}
分别为:m%n 和 m/=n
3、下面程序的功能是输出数组的全排列。请填空
void perm(int list[], int k, int m)
{
if ( )
{
copy(list,list+m,ostream_iterator<int>(cout," "));
cout<<endl;
return;
}
for (int i=k; i<=m; i++)
{
swap(&list[k],&list[i]);
;
swap(&list[k],&list[i]);
}
}
分别为:k==m 和 perm(list,k+1,m)
二、主观题:
1、(40分)用户启动迅雷时,服务器会以uid,login_time,logout_time的形式记录用户的在线时间;用户在使用迅雷下载时,服务器会以taskid,start_time,finish_time的形式记录任务的开始时间和结束时间。有效下载时间是指用户在开始时间和结束时间之间的在线时间,由于用户可能在下载的时候退出迅雷,因此有效下载时间并非finish_time 和 start_time之差。假设登录记录保存在login.txt中,每一行代表用户的上下线记录;下载记录保存在task.txt中,每一行代表一个任务记录,记录的字段之间以空格分开。计算每个用户的有效下载时间和总在线时间的比例。注意:请尽量使用STL的数据结构和算法
2、(60分)在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天。要求尽早聚会,且n个人走的总步数最少,先到聚会地点的骑士可以不再移动等待其他的骑士。
从键盘输入n(0<n<=64),然后一次输入n个骑士的初始位置xi,yi(0<=xi,yi<=7)。屏幕输出以空格分隔的三个数,分别为聚会点(x,y)以及走的天数。
盛大游戏2011.10.22校园招聘会笔试题
1、下列代码的输出为:
- #include "iostream"
- #include "vector"
- using namespace std;
- int main(void)
- {
- vector<int>array;
- array.push_back(100);
- array.push_back(300);
- array.push_back(300);
- array.push_back(500);
- vector<int>::iterator itor;
- for(itor=array.begin();itor!=array.end();itor++)
- {
- if(*itor==300)
- {
- itor = array.erase(itor);
- }
- }
- for(itor=array.begin();itor!=array.end();itor++)
- {
- cout<<*itor<<" ";
- }
- return 0;
- }
A、100 300 300 500 B、100 300 500 C、100 500 D、程序错误
vector在erase之后,指向下一个元素的位置,其实进行erase操作时将后面所有元素都向前移动,迭代器位置没有移动。itor=array.erase(itor) erase返回下一个元素的地址,相当于给itor一个新值。
2、下列代码的输出为:
- class CParent
- {
- public:
- virtual void Intro()
- {
- printf("I'm a Parent, ");
- Hobby();
- }
- virtual void Hobby()
- {
- printf("I like football!");
- }
- };
- class CChild:public CParent
- {
- public:
- virtual void Intro()
- {
- printf("I'm a Child, ");
- Hobby();
- }
- virtual void Hobby()
- {
- printf("I like basketball!\n");
- }
- };
- int main(void)
- {
- CChild *pChild = new CChild();
- CParent *pParent = (CParent*)pChild;
- pParent->Intro();
- return 0;
- }
A、I'm a Child,I like football! B、I'm a Child,I like basketball!
C、I'm a Parent,I like football! D、I'm a Parent,I like basketball!
3、在win32平台下,以下哪种方式无法实现进程同步?
A、Critical Section B、Event C、Mutex D、Semaphore
4、以下哪句的说法是正确的
A、在页式存储管理中,用户应将自己的程序划分为若干个相等的页
B、所有的进程都挂起时,系统将陷入死锁
C、执行系统调用可以被中断
D、进程优先数是进程调度的重要依据,必须根据进程运行情况动态改变
5、以下描述正确的是
A、虚函数是可以内联的,可以减少函数调用的开销提高效率
B、类里面可以同时存在函数名和参数都一样的虚函数和静态函数
C、父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类对象指针会调用父类的析构函数
D、以上都不对
简答题:快速排序的思想是递归的,但是它的平均效率却是众多排序算法中最快的,为什么?请结合本例说明你对递归程序的理解。
算法题:用你熟悉的编程语言,设计如下功能的函数:输入一个字符串,输出该字符串中所有字母的全排列。程序请适当添加注释。
C++函数原型: void Print(const char *str)
输入样例: abc
输出结果: abc、acb、bca、bac、cab、cba
后续整理
- 12个工厂分布在一条东西向高速公路的两侧,工厂距离公路最西端的距离分别是0、4、5、10、12、18、27、30、31、38、39、47.在这12个工厂中选取3个原料供应厂,使得剩余工厂到最近的原料供应厂距离之和最短,问应该选哪三个厂 ?
-
hash冲突时候的解决方法?
1)、开放地址法
2)、再哈希法
3)、链地址法
4)、建立一个公共溢出区 - int main()
{
if()
{
printf("Hello ");
}
else
{
printf("World !!!");
}
return 0;
}
在if里面请写入语句 使得打印出 hello world。
- 今天10.19西山居笔试题:
分别写一个宏和函数来获取元素个数 如count(a) 会得到a数组元素个数 。
- 平均要取多少个(0,1)中的随机数才能让和超过1。(答案: e 次, 其中e是自然对数的底数)
- 今天支付宝10.20笔试题:汉诺塔一共为 2*N,2个一样大小,有编号顺序 每次只能移动一个 大的不能叠在小得上面 移动完之后,相同大小的编号必须和原来一样 问最小要移动多少次? 如 A1 A2 B1 B2 C1 C2 ...... 这样叠,A<B<C.... B不能放A上面,C不能放B A上面,移动到另外一个柱子后,还必须是 A1 A2 B1 B2 C1 C2 ....
- socket编程的问题
TCP连接建立后,调用send 5次,每次发100字节,问recv最少要几次,最多要几次? - 迅雷笔试题:
下面的程序可以从1....n中随机输出m个不重复的数。请填空
knuth(int n, int m)
{
srand((unsigned int)time(0));
for (int i=0; i<n; i++)
if ( )
{
cout<<i<<endl;
( );
}
}
- 四个线程t1,t2,t3,t4,向4个文件中写入数据,t1只能写入1,t2只能写入2,t3只能写入3,t4只能写入4,对4个文件A,B,C,D写入如下内容
A:123412341234.....
B:234123412341....
C:341234123412....
D:412341234123....
怎么实现同步可以让线程并行工作?
- 比如一个数组[1,2,3,4,6,8,9,4,8,11,18,19,100]
前半部分是是一个递增数组,后面一个还是递增数组,但整个数组不是递增数组,那么怎么最快的找出其中一个数?
- 今日10.21迅雷笔试题: 1、一棵二叉树节点的定义(和平时我们定义的一样的) 它给出了一棵二叉树的根节点 说现在怀疑这棵二叉树有问题 其中可能存在某些节点不只有一个父亲节点 现要你编写一个函数判断给定的二叉树是否存在这样的节点 存在则打印出其父亲节点返回true 否则返回false
打印节点形式:
[当前节点][父亲节点1][父亲节点的父亲节点][。。。]
[当前节点][父亲节点2][父亲节点的父亲节点][。。。]
2、有一亿个整数,请找出最大的1000个,要求时间越短越好,空间占用越少越好 - 在频繁使用小内存时,通常会先申请一块大的内存,每次使用小内存时都从大内存里取,最后大内存使用完后一次性释放,用算法实现。
- 今天亚马逊A卷校招笔试题:
输入一个字符串,如何求最大重复出现的字符串呢?比如输入ttabcftrgabcd,输出结果为abc,canffcancd,输出结果为can。 - 今天10.22盛大:删除模式串中出现的字符,如“welcome to asted”,模式串为“aeiou”那么得到的字符串为“wlcm t std",要求性能最优。
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小
数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100
比如a[]={2,4,5,6,7},得出的两组数{2,4,6}和{5,7},abs(sum(a1)-sum(a2))=0;
比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1,所以得出的两组数分别为{2,10}和{5,6}。 - 百度北京研发一道系统设计题,如何快速访问ipv6地址呢?ipv6地址如何存放?
- 百度2012校招北京站笔试题系统设计:正常用户端每分钟最多发一个请求至服务端,服务端需做一个异常客户端行为的过滤系统,设服务器在某一刻收到客户端A的一个请求,则1分钟内的客户端任何其它请求都需要被过滤,现知每一客户端都有一个IPv6地址可作为其ID,客户端个数太多,以至于无法全部放到单台服务器的内存hash表中,现需简单设计一个系统,使用支持高效的过滤,可使用多台机器,但要求使用的机器越少越好,请将关键的设计和思想用图表和代码表现出来。
- #include <iostream>
using namespace std;
class A
{
public:
A(){cout<<"A"<<endl;}
~A(){cout<<"~A"<<endl;}
};
class B
{
public:
B(A &a):_a(a)
{
cout<<"B"<<endl;
}
~B(){cout<<"~B"<<endl;}
private:
A _a;
};
int main()
{
A a;
B b(a);
return 0;
// 构造次序和析构次序是对称的,这种题解答都是有技巧的.
// 拷贝构造就不说了,构造过程是:
// A A B ,那么析构必然是对称的:B A A。
}
九月腾讯,创新工场,淘宝等公司最新面试三十题(第171-200题)
引言
曾记否,去年的10月份也同此刻一样,是找工作的高峰期,本博客便是最初由整理微软等公司面试题而发展而来的。如今,又即将迈入求职高峰期--10月份,所以,也不免关注了网上和我个人建的算法群Algorithms1-12群内朋友发布和讨论的最新面试题。特此整理,以飨诸位。至于答案,望诸位共同讨论与思考。
最新面试十三题
好久没有好好享受思考了。ok,任何人有任何意见或问题,欢迎不吝指导:
- 五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;.....其他几只猴子也都是 这样分的。问:这堆桃至少有多少个?(朋友说,这是小学奥数题)。
参考答案:先给这堆桃子加上4个,设此时共有X个桃子,最后剩下a个桃子.这样:
第一只猴子分完后还剩:(1-1/5)X=(4/5)X;
第二只猴子分完后还剩:(1-1/5)2X;
第三只猴子分完后还剩:(1-1/5)3X;
第四只猴子分完后还剩:(1-1/5)4X;
第五只猴子分完后还剩:(1-1/5)5X=(1024/3125)X;
得:a=(1024/3125)X;
要使a为整数,X最小取3125.
减去加上的4个,所以,这堆桃子最少有3121个。 -
已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
(参考答案:这题主要考的是对概率的理解。程序关键是要算出rand10,1到10,十个数字出现的考虑都为10%.根据排列组合,连续算两次rand7出现的组合数是7*7=49,这49种组合每一种出现考虑是相同的。怎么从49平均概率的转换为1到10呢?方法是:
1.rand7执行两次,出来的数为a1=rand7()-1,a2=rand7()-1.
2.如果a1*7+a2<40,b=(a1*7+a2)/4+1;如果a1*7+a2>=40,重复第一步。参考代码如下所示:- int rand7()
- {
- return rand()%7+1;
- }
- int rand10()
- {
- int a71,a72,a10;
- do
- {
- a71= rand7()-1;
- a72 = rand7()-1;
- a10 = a71 *7 + a72;
- } while (a10>= 40);
- return (a71*7+a72)/4+1;
- }
- 如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。思路:判断各自素数乘积是否相等。更多方法请参见:http://blog.csdn.net/v_JULY_v/article/details/6347454。
- 要求设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快。
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1) 。(此题一直没看到令我满意的答案,一般达不到题目所要求的:时间复杂度O(N),空间O(1),且保证原来正负数之间的相对位置不变)。
updated:设置一个起始点j, 一个翻转点k,一个终止点L
从右侧起
起始点在第一个出现的负数, 翻转点在起始点后第一个出现的正数,终止点在翻转点后出现的第一个负数(或结束)
如果无翻转点, 则不操作
如果有翻转点, 则待终止点出现后, 做翻转, 即ab => ba 这样的操作
翻转后, 负数串一定在左侧, 然后从负数串的右侧开始记录起始点, 继续往下找下一个翻转点
例子中的就是1, 7, -5, 9, -12, 15
第一次翻转: 1, 7, -5, -12,9, 15 => 1, -12, -5, 7, 9, 15
第二次翻转: -5, -12, 1, 7, 9, 15N维翻转空间占用为O(1)复杂度是2N;在有一个负数的情况下, 复杂度最大是2N, ;在有i个负数的情况下, 复杂度最大是2N+2i, 但是不会超过2N+N实际的复杂度在O(3N)以内
但从最终时间复杂度分析,此方法是否真能达到O(N)的时间复杂度,还待后续考证。感谢John_Lv,MikovChain。2012.02.25。1, 7, -5, -6, 9, -12, 15(后续:此种情况未能处理)
1 7 -5 -6 -12 9 15
1 -12 -5 -6 7 9 15
-6 -12 -5 1 7 9 15更多请参考此文,程序员编程艺术第二十七章:重新排列数组(不改变相对顺序&时间O(N)&空间O(1),半年未被KO)http://blog.csdn.net/v_july_v/article/details/7329314。
- 淘宝面试题:有一个一亿节点的树,现在已知两个点,找这两个点的共同的祖先。
- 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。(此题请参考本博客内其它文章)。
-
某服务器流量统计器,每天有1000亿的访问记录数据,包括时间、url、ip。设计系统实现记录数据的
保存、管理、查询。要求能实现一下功能:
(1)计算在某一时间段(精确到分)时间内的,某url的所有访问量。
(2)计算在某一时间段(精确到分)时间内的,某ip的所有访问量。 -
假设某个网站每天有超过10亿次的页面访问量,出于安全考虑,网站会记录访问客户端访问的ip地址和对应的时间,如果现在已经记录了1000亿条数据,想统计一个指定时间段内的区域ip地址访问量,那么这些数据应该按照何种方式来组织,才能尽快满足上面的统计需求呢,
设计完方案后,并指出该方案的优缺点,比如在什么情况下,可能会非常慢?(参考答案:用B+树来组织,非叶子节点存储(某个时间点,页面访问量),叶子节点是访问的IP地址。这个方案的优点是查询某个时间段内的IP访问量很快,但是要统计某个IP的访问次数或是上次访问时间就不得不遍历整个树的叶子节点。或者可以建立二级索引,分别是时间和地点来建立索引。) -
腾讯1.服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号。(此题与稍后下文的第14题重复,思路参考请见下文第14题)。
腾讯2.如何求根号2的值,并且按照我的需要列出指定小数位,比如根号2是1.141 我要列出1位小数就是1.1 2位就是1.14, 1000位就是1.141...... 等。。 -
-
- 我们有很多瓶无色的液体,其中有一瓶是毒药,其它都是蒸馏水,实验的小白鼠喝了以后会在5分钟后死亡,而喝到蒸馏水的小白鼠则一切正常。现在有5只小白鼠,请问一下,我们用这五只小白鼠,5分钟的时间,能够检测多少瓶液体的成分?
淘宝2012笔试(研发类):http://topic.csdn.net/u/20110922/10/e4f3641a-1f31-4d35-80da-7268605d2d51.html(一参考答案)。
ok,这13道题加上此前本博客陆陆续续整理的微软面试187题:重启开源,分享无限--诚邀你加入微软面试187题的解题中,至此,本博客内已经整理了整整200道面试题。
后续整理
以下是后续整理的最新面试题,不断更新中(2011.09.26).....
14、腾讯最新面试题:服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号。
以下是个人所建第Algorithms_12群内朋友的聊天记录:
首先你要注意到,数据存在服务器,存储不了(内存存不了),要想办法统计每一个qq出现的次数。
比如,因为内存是1g,首先 你用hash 的方法,把qq分配到10个(这个数字可以变动,比较)文件(在硬盘中)。
相同的qq肯定在同一个文件中,然后对每一个文件,只要保证每一个文件少于1g的内存,统计每个qq的次数,可以使用hash_map(qq, qq_count)实现。然后,记录每个文件的最大访问次数的qq,最后,从10个文件中找出一个最大,即为所有的最大。更多读者可以参见此文:海量数据处理面试题集锦与Bit-map详解 。那若面试官问有没有更高效率的解法之类的?这时,你可以优化一下,但是这个速度很快,hash函数,速度很快,他肯定会问,你如何设计,用bitmap也行。15、百度今天的笔试题:在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。
16、华为社招现场面试1:请使用代码计算1234567891011121314151617181920*2019181716151413121110987654321 。
华为面试2:1分2分5分的硬币,组成1角,共有多少种组合。
17、百度笔试题:
一、系统有很多任务,任务之间有依赖,比如B依赖于A,则A执行完后B才能执行
(1)不考虑系统并行性,设计一个函数(Task *Ptask,int Task_num)不考虑并行度,最快的方法完成所有任务。
(2)考虑并行度,怎么设计
typedef struct{
int ID;
int * child;
int child_num;
}Task;
提供的函数:
bool doTask(int taskID);无阻塞的运行一个任务;
int waitTask(int timeout);返回运行完成的任务id,如果没有则返回-1;
bool killTask(int taskID);杀死进程二、必答题(各种const)
1、解释下面ptr含义和不同
double* ptr = &value;
//ptr是一个指向double类型的指针,ptr的值可以改变,ptr所指向的value的值也可以改变
const double* ptr = &value
//ptr是一个指向const double类型的指针,ptr的值可以改变,ptr所指向的value的值不可以改变
double* const ptr=&value
//ptr是一个指向double类型的指针,ptr的值不可以改变,ptr所指向的value的值可以改变
const double* const ptr=&value
//ptr是一个指向const double类型的指针,ptr的值不可以改变,ptr所指向的value的值也不可以改变 2、去掉const属性,例: const double value = 0.0f; double* ptr = NULL;怎么才能让ptr指向value?
强制类型转换,去掉const属性,如ptr = <const_cast double *>(&value);18、如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列投到队列尾的元素个数(包含队列头、队列尾)(华赛面试题、腾讯笔试题)。
19、昨晚淘宝笔试题:
1. 设计相应的数据结构和算法,尽量高效的统计一片英文文章(总单词数目)里出现的所有英文单词,按照在文章中首次出现的顺序打印输出该单词和它的出现次数。
2、有一棵树(树上结点为字符串或者整数),请写代码将树的结构和数据写到一个文件中,并能通过读取该文件恢复树结构 。
20、13个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球?(http://zhidao.baidu.com/question/66024735.html
)。21、搜狗笔试题:一个长度为n的数组a[0],a[1],...,a[n-1]。现在更新数组的名个元素,即a[0]变为a[1]到a[n-1]的积,a[1]变为a[0]和a[2]到a[n-1]的积,...,a[n-1]为a[0]到a[n-2]的积(就是除掉当前元素,其他所有元素的积)。程序要求:具有线性复杂度,且不能使用除法运算符。
思路:left[i]标示着a[i]之前的乘积,right[i]标示着a[i]之后的乘积,但不申请空间,那么a[i]=left[i]*right[i] 。不过,left的计算从左往右扫的时候得出,right是从右往左扫得出。因为就是当中某个元素a[i]的左边所有元素与右边所有元素的乘积,就这么简单。所以计算a[i]=left[i]*right[i]时,直接出结果。
22、后2012年4月6日的腾讯暑期实习生招聘笔试中,出了一道与上述21题类似的题,原题大致如下:
两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];
要求:
1.不准用除法运算
2.除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等)
3.满足时间复杂度O(n),空间复杂度O(1)。说白了,你要我求b=a[0]*a*...a[i-1]*a*a[i+1]..*a[N-1]/a ,就是求:a[0]*a[1]*...a[i-1]*a[i+1]..*a[N-1]。只是我把a[i]左边部分标示为left[i],b[i]右边部分标示为right[i],而实际上完全不申请left[i],与right[i]变量,之所以那样标示,无非就是为了说明:除掉当前元素a[i],其他所有元素(a[i]左边部分,和a[i]右边部分)的积。读者你明白了么?
下面是此TX笔试题的两段参考代码,如下:
from wasd608105 8上面第二段代码最后一行的意义是: 我们看第二个循环,从N-2到 1;再看for循环中b[0]的赋值,从N-1到2, 而根据题目要求b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i], b[0]应等于a[1]*a[2]* ....a[N-1],所以这里手动添加a[1]。
- //ncicc
- b[0] = 1;
- for (int i = 1; i < N; i++)
- {
- b[0] *= a[i-1];
- b[i] = b[0];
- }
- b[0] = 1;
- for (i = N-2; i > 0; i--)
- {
- b[0] *= a[i+1];
- b[i] *= b[0];
- }
- b[0] *= a[1];
此外,也有朋友在微博上:http://weibo.com/1761944724/ydwuMt9bH 给出了另外一种解法,如下图所示:
23、腾讯高水平复试题:
1.有不同的手机终端,如iphone,安卓,Symbian,不同的终端处理不一样,设计一种服务器和算法实现对不同的终端的处理。
2.设计一种内存管理算法。
3.A向B发邮件,B收到后读取并发送收到,但是中间可能丢失了该邮件,怎么设计一种最节省的方法,来处理丢失问题。
4.设计一种算法求出算法复杂度 。
24、人人笔试1:一个人上台阶可以一次上1个,2个,或者3个,问这个人上n层的台阶,总共有几种走法?人人笔试2:在人人好友里,A和B是好友,B和C是好友,如果A 和C不是好友,那么C是A的二度好友,在一个有10万人的数据库里,如何在时间0(n)里,找到某个人的十度好友。25、淘宝算法面试题:两个用户之间可能互相认识,也可能是单向的认识,用什么数据结构来表示?如果一个用户不认识别人,而且别人也不认识他,那么他就是无效节点,如何找出这些无效节点?自定义数据接口并实现之,要求尽可能节约内存和空间复杂度。26、淘宝笔试题: 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。27、腾讯面试题:给你5个球,每个球被抽到的可能性为30、50、20、40、10,设计一个随机算法,该算法的输出结果为本次执行的结果。输出A,B,C,D,E即可。28、搜狐笔试题:给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。29、阿里巴巴研究院(2009):
1. 有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间2. 25匹赛马,5个跑道,也就是说每次有5匹马可以同时比赛。问最少比赛多少次可以知道跑得最快的5匹马3. 有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N平均分布的,也就是说V[N]里面任意一个数都有1/N的机会被取出,要求空间复杂度为O(1)
30、微软面试题:Given a head pointer pointing to a linked list ,please write a function that sort the list
in increasing order. You are not allowed to use temporary array or memory copy
struct
{
int data;
struct S_Node *next;
}Node;
Node * sort_link_list_increasing_order (Node *pheader):
更新至2011.09.30....
如果各位对上面的题目有好的思路,或者还有好的面试题分享,欢迎添加到本文评论下,或者发至我的邮箱:zhoulei0709@yahoo.cn。谢谢大家。July、2011.09.30。
十月百度,阿里巴巴,迅雷搜狗最新面试七十题(第201-270题)
引言
当即早已进入10月份,十一过后,招聘,笔试,面试,求职渐趋火热。而在这一系列过程背后浮出的各大IT公司的笔试/面试题则蕴含着诸多思想与设计,细细把玩,思考一番亦能有不少收获。
上个月,本博客着重整理九月腾讯,创新工场,淘宝等公司最新面试十三题,此次重点整理百度,阿里巴巴,迅雷和搜索等公司最新的面试题。同上篇一样,答案望诸君共同讨论之,个人亦在慢慢思考解答。多谢。
最新面试十一题
- 十月百度:一个数组保存了N个结构,每个结构保存了一个坐标,结构间的坐标都不相同,请问如何找到指定坐标的结构(除了遍历整个数组,是否有更好的办法)?(要么预先排序,二分查找。要么哈希。hash的话,坐标(x,y)你可以当做一个2位数,写一个哈希函数,把(x,y)直接转成“(x,y)”作为key,默认用string比较。或如Edward Lee所说,将坐标(x, y)作为 Hash 中的 key。例如(m, n),通过 (m,n) 和 (n, m) 两次查找看是否在 HashMap 中。也可以在保存时就规定 (x, y) , x < y ,在插入之前做个判断。)
- 百度最新面试题:现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来。(编程珠玑上有此类似的一题,如果有足够的内存的话可以用位图法,即开一个1亿位的bitset,内存为100m/8== 12.5m, 然后如果一个数有出现,对应的bitset上标记为1,最后统计bitset上为0的即可。)
-
Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法
String extractSummary(String description,String[] key words)
目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。(扫描过程始终保持一个[left,right]的range,初始化确保[left,right]的range里包含所有关键字则停止。然后每次迭代:
1,试图右移动left,停止条件为再移动将导致无法包含所有关键字。
2,比较当前range's length和best length,更新最优值。
3,右移right,停止条件为使任意一个关键字的计数+1。
4,重复迭代。!!!!!!!!!!类似于Leetcodehttp://oj.leetcode.com/problems/minimum-window-substring/
编程之美有最短摘要生成的问题,与此问题类似,读者可作参考。) - 搜狗:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度(参考:第五章、寻找满足条件的两个或多个数)。
- 迅雷:给你10台机器,每个机器2个cpu,2g内存,现在已知在10亿条记录的数据库里执行一次查询需要5秒,问用什么方法能让90%的查询能在100毫秒以内返回结果。(@geochway:将10亿条记录排序,然后分到10个机器中,分的时候是一个记录一个记录的轮流分,
确保每个机器记录大小分布差不多,每一次查询时,同时提交给10台机器,同时查询,
因为记录已排序,可以采用二分法查询。
如果无法排序,只能顺序查询,那就要看记录本身的概率分布,否则不可能实现。
一个机器2个CPU未必能起到作用,要看这两个CPU能否并行存取内存,取决于系统架构。) - 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?
- 腾讯:五笔的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把五笔的编码按字典序排序,形成一个数组如下:
a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy
其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。
1)编写一个函数,输入是任意一个编码,比如baca,输出这个编码对应的Index;
2)编写一个函数,输入是任意一个Index,比如12345,输出这个Index对应的编码。 - 2011.10.09百度笔试题(下述第8-12题):linux/unix远程登陆都用到了ssh服务,当网络出现错误时服务会中断,linux/unix端的程序会停止。为什么会这样?说下ssh的原理,解释中断的原理。
- 一个最小堆,也是完全二叉树,用按层遍历数组表示。
1. 求节点a[n]的子节点的访问方式
2. 插入一节点的程序void add_element(int *a,int size,int val);
3. 删除最小节点的程序。 - a)求一个全排列函数:如p([1,2,3]) ,输出: [123],[132],[213],[231],[321],[323]。
b)求一个组合函数: 如p([1,2,3]) ,输出:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]。
这两问可以用伪代码(全排列请参考这里的第67题:微软、Google等公司非常好的面试题及解答[第61-70题] )。 - 有这样一种编码:如,N=134,M=f(N)=143,N=020,M=fun(N)=101,其中N和M的位数一样,N,M可以均可以以0开头,N,M的各位数之和要相等,即1+3+4=1+4+3,且M是大于N中最小的一个,
现在求这样的序列S,N为一个定值,其中S(0)=N,S(1)=fun(N),S(2)=fun(S(1))。 - 有1000万条URL,每条URL 50字节,只包含主机前缀,要求实现URL提示系统:
(1)要求实时更新匹配用户输入的地址,每输出一个字符,输出最新匹配URL
(2)每次只匹配主机前缀,例如对 www.abaidu.com和www.baidu.com,用户输入www.b时只提示www.baidu.com(3)每次提供10条匹配的URL
(4)以用户需求为主。 - 海量记录,记录形式如下: TERMID URLNOCOUNT urlno1 urlno2 ..., urlnon
怎么考虑资源和时间这两个因素,实现快速查询任意两个记录的交集,并集等,设计相关的数据结构和算法。 - 百度最新笔试题(感谢xiongyangwan提供的题目):利用互斥量和条件变量设计一个消息队列,具有以下功能:
1 创建消息队列(消息中所含的元素)
2 消息队列中插入消息
3 取出一个消息(阻塞方式)
4 取出第一消息(非阻塞方式) - 百度移动终端研发笔试:系统设计题(40分)
对已排好序的数组A,一般来说可用二分查找可以很快找到。现有一特殊数组A[],它是循环递增的,如A[]={ 17 19 20 25 1 4 7 9},试在这样的数组中找一元素x,看看是否存在。
请写出你的算法,必要时可写伪代码,并分析其空间、时间复杂度。 - #include<stdio.h>
#include <string.h>
void main()
{
int a[2000];
char *p = (char *)a;
int i ;
for( i = 0; i < 2000; i++)
a[i] = -i -1;
printf("%d\n", strlen(p));
}
写出输出结果( onlyice:i = FFFFFF00H 的时候,才有'\0'出现,就是最后一个字节,C风格字符串读到'\0'就终止了。FFFFFF00H 是 -256,就是 i 的值为255时a[i] = FFFFFF00H ) .... - 腾讯10.09测试笔试题:有N+2个数,N个数出现了偶数次,2个数出现了奇数次(这两个数不相等),问用O(1)的空间复杂度,找出这两个数,不需要知道具体位置,只需要知道这两个值。(@Rojay:xor一次,得到2个奇数次的数之和x。第二步,以x(展开成二进制)中有1的某位(假设第i位为1)作为划分,第二次只xor第i位为1的那些数,得到y。然后x xor y以及y便是那两个数。 )
- @well:一个整数数组,有n个整数,如何找其中m个数的和等于另外n-m个数的和?(与上面第4题类似,参考:第五章、寻找满足条件的两个或多个数)。
- 阿里云笔试题:一个HTTP服务器处理一次请求需要500毫秒,请问这个服务器如何每秒处理100个请求。
- 今天10.10阿里云笔试@土豆:1、三次握手;2、死锁的条件。(互斥条件(Mutual exclusion):1、资源不能被共享,只能由一个进程使用。2、请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。3、非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。4、循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。处理死锁的策略:1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。2.检测死锁并且恢复。3.仔细地对资源进行动态分配,以避免死锁。4.通过破除死锁四个必要条件之一,来防止死锁产生。)
-
微软2011最新面试题(以下三题,第22、23、24题皆摘自微软亚洲研究院的邹欣老师博客):浏览过本人的程序员编程艺术系列的文章,一定对其中的这个问题颇有印象:第七章、求连续子数组的最大和。求数组最大子数组的和最初来源于编程之美,。我在编程艺术系列中提供了多种解答方式,然而这个问题若扩展到二维数组呢?再者,若数组首尾相连, 像一个轮胎一样, 又怎么办呢?聪明的同学还是给出了漂亮的答案, 并且用 SilverLight/WPF 给画了出来, 如下图所示:
好,设想现在我们有一张纸带,两面都写满了像如上第一幅图那样的数字, 我们把纸带的一端扭转, 和另一端接起来, 构成一个莫比乌斯环 (Möbius Strip,如将一个长方形纸条ABCD的一端AB固定,另一端DC扭转半周后,把AB和CD粘合在一起 ,得到的曲面就是麦比乌斯圈,也称莫比乌斯带。),如下图所示:
如上,尽管这个纸带扭了一下, 但是上面还是有数组, 还是有最大子数组的和,对么? 在求最大子数组的和之前, 我们用什么样的数据结构来表示这些数字呢? 你可以用 Java, C, C#, 或其他语言的数据结构来描述这个莫比乌斯环上的数组。数据结构搞好了, 算法自然就有了。(@风大哥:莫比乌斯带,用环形数组或者链表可以表示。环型数组的话,1-N,到N特殊处理一下,连到1就是环型数组了,一个纸带上正反两面各有N个数,A1...An,B1...Bn,那么就可以构造一个新的数组:A1-An-B1-Bn.访问到Bn下一位就是A1,就是环形的数组了。从某个位置k开始,用i,j向一个方向遍历,直到i到达k位置,或者i=j,被追上,用数组需要一点技巧,就是J再次过k需要打个标志,以便计算终止条件和输出。当然,如果用链表就更简单了。把链表首尾相接即可,即An执行B1,Bn指向A1即可。)
- 《编程之美》的第一题是让Windows 任务管理器的CPU 使用率曲线画出一个正弦波。我一直在想, 能不能把CPU 使用率边上的网络使用率也如法炮制一下呢? 比如, 也来一个正弦曲线?
-
如果你没看过, 也至少听说<人月神话> (The Mythical Man-month) 这本在软件工程领域很有影响的书. 当你在微软学术搜索中输入 “manmonth” 这个词的时候, 你会意外地碰到下面这个错误:
经过几次试验之后, 你发现必须要输入 “man-month” 才能得到希望的结果。 这不就是只差一个 ‘-’ 符号么? 为什么这个搜索引擎不能做得聪明一些, 给一些提示 (Query Suggestion)? 或者自动把用户想搜的结果展现出来 (Query Alteration)? 我们在输入比较长的英文单词的时候, 也难免会敲错一两个字母, 网站应该帮助用户, 而不是冷冰冰地拒绝用户啊。
微软的学术搜索 (Microsoft Academic Search) 索引了超过 3千万的文献, 2 千万的人名, 怎么能以比较小的代价, 对经常出现的输入错误提供提示? 或直接显示相关结果, 避免用户反复尝试输入的烦恼?
你可能会说, 这很难吧, 但是另一家搜索引擎似乎轻易地解决了这个问题 (谷歌,读者可以一试)。 所以, 还是有办法的。
这个题目要求你:
1) 试验不同的输入, 反推出目前微软的学术搜索是如何实现搜索建议 (Query Suggestion)的。
2) 提出自己的改进建议, 并论证这个解决方案在千万级数据规模上能达到 “足够好” 的时间 (speed) 和空间 (memory usage)效率。
3) 估计这事需要几个 人·月 (man-month) 才能做完? (备注:顺便给邹欣老师传个话,如果应届毕业生可以能做好上述全部三个题目,便可直接找他。http://www.cnblogs.com/xinz/archive/2011/10/10/2205232.html)。 -
今天10.10阿里云部分笔试题目:
1、一个树被序列化为数组,如何反序列化。
2、如何将100百万有序数据最快插入到STL的map里。
3、有两个线程a、b分别往一条队列push和pop数据,在没有锁和信号量的情况下如何避免冲突访问。
4、写一个函数,功能是从字符串s中查找出子串t,并将t从s中删除。 - 将长度为m和n的两个升序数组复制到长度为m+n的数组里,升序排列。
-
tencent2012笔试题附加题
问题描述: 例如手机朋友网有n个服务器,为了方便用户的访问会在服务器上缓存数据,因此用户每次访问的时候最好能保持同一台服务器。
已有的做法是根据ServerIPIndex[QQNUM%n]得到请求的服务器,这种方法很方便将用户分到不同的服务器上去。但是如果一台服务器死掉了,那么n就变为了n-1,那么ServerIPIndex[QQNUM%n]与ServerIPIndex[QQNUM%(n-1)]基本上都不一样了,所以大多数用户的请求都会转到其他服务器,这样会发生大量访问错误。问: 如何改进或者换一种方法,使得:
(1)一台服务器死掉后,不会造成大面积的访问错误,
(2)原有的访问基本还是停留在同一台服务器上;
(3)尽量考虑负载均衡。(思路:往分布式一致哈希算法方面考虑。关于此算法,可参见此文:http://blog.csdn.net/21aspnet/article/details/5780831) -
腾讯面试题:A.txt和B.txt两个文件,A.txt有1亿个QQ号 , B.txt 100W个QQ号, 用代码实现交、并、差。
-
说出下面的运行结果
#include <iostream>
using namespace std;class A
{
public:
virtual void Fun(int number = 10)
{
std::cout << "A::Fun with number " << number<<endl;
}
};class B: public A
{
public:
virtual void Fun(int number = 20)
{
std::cout << "B::Fun with number " << number<<endl;
}
};int main()
{
B b;
A &a = b;
a.Fun();
return 0;
} //虚函数动态绑定=>B,非A,缺省实参是编译时候确定的=>10,非20 。 -
今晚阿里云笔试:有101根电线 每根的一头在楼底 另一端在楼顶 有一个灯泡 一个电池 无数根很短的电线 怎么样在楼上一次在楼下去一次将电线的对应关系弄清楚。
- 金山笔试题:
1、C ++为什么经常将析构函数声明为虚函数?
2、inline和#define的如何定义MAX,区别是什么。
3、const的用法,如何解除const限制。
4、智能指针的作用和设计原理。
5、STL中vetor如何自己设计,关键设计点,函数声明,自定义删除重复元素的函数。
6、如何用一条SQL语句,删除表中某字段重复的记录。 -
淘宝:
在现代web服务系统的设计中,为了减轻源站的压力,通常采用分布式缓存技术,其原理如下图所示,前端的分配器将针对不同内容的用户请求分配给不同的缓存服务器向用户提供服务。
分配器
/ | \
缓存 缓存 . ..缓存
服务器1 服务器2 ...服务器n1)请问如何设置分配策略,可以保证充分利用每个缓存服务器的存储空间(每个内容只在一个缓存服务器有副本)
2)当部分缓存服务器故障,或是因为系统扩容,导致缓存服务器的数量动态减少或增加时,你的分配策略是否可以保证较小的缓存文件重分配的开销,如果不能,如何改进?
3)当各个缓存服务器的存储空间存在差异时(如有4个缓存服务器,存储空间比为4:9:15:7),如何改进你的策略,按照如上的比例将内容调度到缓存服务器?(思路:往memcached或者一致性hash算法方面考虑,但具体情况,具体分析。) -
腾讯:50个台阶,一次可一阶或两阶,共有几种走法(老掉牙的题了,详见微软面试100题2010版。
long long Fibonacci_Solution1(unsigned int n)
{
int result[2] = {0, 1};
if(n < 2)
return result[n];return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);
})。 -
有两个float型的数,一个为fmax,另一个为fmin,还有一个整数n,如果 (fmax - fmin)/n ,不能整除,怎么改变fmax,fmin,使改变后可以整除n 。
-
2011.10.11最新百度电面:
1、动态链接库与静态链接库的区别( 静态链接库是.lib格式的文件,一般在工程的设置界面加入工程中,程序编译时会把lib文件的代码加入你的程序中因此会增加代码大小,你的程序一运行lib代码强制被装入你程序的运行空间,不能手动移除lib代码。
动态链接库是程序运行时动态装入内存的模块,格式*.dll,在程序运行时可以随意加载和移除,节省内存空间。
在大型的软件项目中一般要实现很多功能,如果把所有单独的功能写成一个个lib文件的话,程序运行的时候要占用很大的内存空间,导致运行缓慢;但是如果将功能写成dll文件,就可以在用到该功能的时候调用功能对应的dll文件,不用这个功能时将dll文件移除内存,这样可以节省内存空间。)
2、指针与引用的区别(相同点:1. 都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。区别:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
4. 引用没有 const,指针有 const;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
7. 指针和引用的自增(++)运算意义不一样;
8.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。)
3、进程与线程的区别(①从概念上:
进程:一个程序对一个数据集的动态执行过程,是分配资源的基本单位。
线程:一个进程内的基本调度单位。
线程的划分尺度小于进程,一个进程包含一个或者更多的线程。
②从执行过程中来看:
进程:拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率。
线程:每一个独立的线程,都有一个程序运行的入口、顺序执行序列、和程序的出口。但是线程不能够独立的执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
③从逻辑角度来看:(重要区别)
多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但是,操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源分配。)
4、函数调用入栈出栈的过程
4、c++对象模型与虚表
5、海量数据处理,以及如何解决Hash冲突等问题
6、系统设计,概率算法 -
今天腾讯面试:
一个大小为N的数组,里面是N个整数,怎样去除重复,
要求时间复杂度为O(n),空间复杂度为O(1)(此题答案请见@作者hawksoft:http://blog.csdn.net/hawksoft/article/details/6867493)。 -
一个长度为10000的字符串,写一个算法,找出最长的重复子串,如abczzacbca,结果是bc(思路:后缀树/数组的典型应用,@well:就是求后缀数组的height[]的最大值)。后缀数组的论文还没看呢
- 今晚10.11大华笔试题:建立一个data structure表示没有括号的表达式,而且找出所有等价(equivalent)的表达式
比如: 微策略几年前也有过,待研究
3×5 == 5×3
2+3 == 3+2 - 今晚10.11百度二面:判断一个数的所有因数的个数是偶数还是奇数(完全平方数的因数个数为奇数,非完全平方数因数个数为偶数)。
- 比如A认识B,B认识C,但是A不认识C, 那么称C是A的二度好友。找出某个人的所有十度好友. 数据量为10万(BFS,同时记录已遍历过的顶点,遍历时遇到的已遍历过的顶点不插入队列。此是今晚10.11人人笔试题目,但它在上个月便早已出现在本人博客中,即此文第23题第2小题:九月腾讯,创新工场,淘宝等公司最新面试十三题)。
- map在什么情况下会发生死锁;stl中的map是怎么实现的?(有要参加淘宝面试的朋友注意,淘宝喜欢问STL方面的问题)
- 昨日笔试:有四个人,他们每次一起出去玩的时候,用同时剪刀包袱锤的方式决定谁请客。设计一种方法,使得他们只需出一次,就可以决定请客的人,并且每个人请客的几率相同,均为25%。 要求只出剪刀和石头
剪刀代表0,石头代表1
对于2人的情况.取异或,为0则A请客,为1则B请客
对于4人的情况,分为2组(x,y),如果两组的异或为1则x组请客,x组内参照2人体系.如果异或为0则y组请客. 一个想法求指正,A不玩,B只能出剪刀包袱,C只能出包袱锤子,D只能出锤子剪刀,如果BCD出来三种手势,就是A请客,否则三人中就是两人手势相同,一人不同,那么就是那一个人请客,概率应该都是25%,但是不知道是否符合“用同时剪刀包袱锤的方式决定谁请客”。。。。 - Given two sets of n numbers a1, a2…, an and b1, b2…bn, find, in polynomial time, a permutation Π such that ∑i |ai - b Π(i)| is minimized? Prove your algorithm works. 题目没读懂!!!
有两个数组,在多项式时间里找到使 两数组元素 的差 的绝对值 的和 最小 的一种置换。
并证明算法的有效性。注意,关键是证明。(此题个人去年整理过类似的一题,详见微软面试100题2010版第32题:http://blog.csdn.net/v_JULY_v/archive/2011/01/10/6126444.aspx) -
对已排好序的数组A,一般来说可用二分查找 可以很快找到。
现有一特殊数组A[],它是循环递增的,如A[]={ 17 19 20 25 1 4 7 9},
试在这样的数组中找一元素x,看看是否存在。
请写出你的算法,必要时可写伪代码,并分析其空间 时间复杂度。 - 网易:题意很简单,写一个程序,打印出以下的序列。
(a),(b),(c),(d),(e)........(z)
(a,b),(a,c),(a,d),(a,e)......(a,z),(b,c),(b,d).....(b,z),(c,d).....(y,z)
(a,b,c),(a,b,d)....(a,b,z),(a,c,d)....(x,y,z)
....
(a,b,c,d,.....x,y,z)(思路:全排列问题) -
int global = 0;
// thread 1
for(int i = 0; i < 10; ++i)
global -= 1;// thread 2
for(int i = 0; i < 10; ++i)
global += 1;之后global的可能的值是多少(多种可能)?-10~10
- 今天10.13新浪笔试:
1、用隐喻说明class和object的区别,要求有新意。
2、DDL,DML,DCL的含义,和距离
3、TCP建立连接的三次握手
4、设计人民币面值,要求种类最少,表示1——1000的所有数,平均纸币张数最少??????
5、UML -
一个数组。里面的数据两两相同,只有两个数据不同,要求找出这两个数据。要求时间复杂度0(N)空间复杂度O(1)。 http://blog.csdn.net/u010590166/article/details/17468725
-
两个数相乘,小数点后位数没有限制,请写一个高精度算法。
- 面试基础题:
1、静态方法里面为什么不能声明静态变量?java?
2、如果让你设计一个类,什么时候把变量声明为静态类型?比如你想查看构造函数或者拷贝构造函数调用的次数从而判断有多少个对象生成的话,那么就可以使用一个静态成员。还有像单件模式里面也用静态成员来实现。
3、抽象类和接口的具体区别是什么?java? -
谷歌昨晚10.13算法笔试三题:
1.一个环形公路,上面有N个站点,A1, ..., AN,其中Ai和Ai+1之间的距离为Di,AN和A1之间的距离为D0。
高效的求第i和第j个站点之间的距离,空间复杂度不超过O(N)
它给出了部分代码如下:
#define N 25
double D[N]
....
void Preprocess()
{
//Write your code1;
}
double Distance(int i, int j)
{
//Write your code2;
}2. 一个字符串,压缩其中的连续空格为1个后,对其中的每个字串逆序打印出来。比如"abc efg hij"打印为"cba gfe jih"。
3. 将一个较大的钱,不超过1000000(10^6)的人民币,兑换成数量不限的100、50、10、5、2、1的组合,请问共有多少种组合呢?(其它选择题考的是有关:操作系统、树、概率题、最大生成树有关的题,另外听老梦说,谷歌不给人霸笔的机会。)。
-
谷歌在线笔试题:
输入两个整数A和B,输出所有A和B之间满足指定条件的数的个数。指定条件:假设C=8675在A跟B之间,若(8+6+7+5)/ 4 > 7,则计一个,否则不计。
要求时间复杂度:log(A)+log(B)。 - 十五道百度、腾讯面试基础测试题@fengchaokobe:
1、写一个C的函数,输入整数N,输出整数M,M满足:M是2的n次方,且是不大于N中最大的2的n次方。例如,输入4,5,6,7,都是输出4 。
2、C++中虚拟函数的实现机制。
3、写出选择排序的代码及快速排序的算法。
4、你认为什么排序算法最好?
5、tcp/ip的那几层协议,IP是否是可靠的?为什么?
6、进程和线程的区别和联系,什么情况下用多线程,什么时候用多进程?
7、指针数组和数组指针的区别。
8、查找单链表的中间结点。
9、最近在实验室课题研究或工作中遇到的技术难点,怎么解决的?
10、sizeof和strlen的区别。
11、malloc-free和new-delete的区别
12、大数据量中找中位数。
13、堆和栈的区别。
14、描述函数调用的整个过程。
15、在一个两维平面上有三个不在一条直线上的点。请问能够作出几条与这些点距离相同的线? - 搜狐的一道笔试题:
char *s="mysohu";
s[0]=0; //..
printf("%s",s);
输出是什么啊?
搜狐的一道大题:
数组非常长,如何找到第一个只出现一次的数字,说明算法复杂度。(与个人之前整理的微软面试100题中,第17题:在一个字符串中找到第一个只出现一次的字符。类似,读者可参考。) - 百度笔试3. 假设有一台迷你计算机,1KB的内存,1MHZ的cpu,已知该计算机执行的程序可出现确定性终止(非死循环),问如何求得这台计算机上程序运行的最长时间,可以做出任何大胆的假设。分析:任何时候内存状态都不能相同,否则进入死循环:假设某2个时刻t1,t2满足t1小于t2,内存的状态完全相同,那么到达t2时刻又想当于回到了t1的执行位置。1k的内存共有状态 2^(1024*8)个(相当大)每秒cpu为1m,一秒钟改变1m次,所以两者相除即可得CPU的最长运行时间。首先程序是确定性的,就说明内存的状态不会重复,否则就永远结束不了。从这一点出发,可以知道内存的状态共有 2^8k , 然后CPU每秒改变 2^20 个状态,所以这台计算机最长出现不重复的状态 2^(8k-20)秒。
- 微软10.15笔试:对于一个数组{1,2,3}它的子数组有{1,2},{1,3}{2,3},{1,2,3},元素之间可以不是连续的,对于数组{5,9,1,7,2,6,3,8,10,4},升序子序列有多少个?或者换一种表达为:数组int a[]={5,9,1,7,2,6,3,8,10,4} 。求其所有递增子数组(元素相对位置不变)的个数, 例如:{5,9},{5,7,8,10},{1,2,6,8}。http://blog.csdn.net/zhangmytf/article/details/9531415
-
今日腾讯南京笔试题: M*M的方格矩阵,其中有一部分为障碍,八个方向均可以走,现假设矩阵上有Q+1节点,从(X0,Y0)出发到其他Q个节点的最短路径。Floyd-Warshall最短路径算法
其中,1<=M<=1000,1<=Q<=100。 -
另外一个笔试题:
一个字符串S1:全是由不同的字母组成的字符串如:abcdefghijklmn
另一个字符串S2:类似于S1,但长度要比S1短。
问题是,设计一种算法,求S2中的字母是否均在S1中。(字符串包含问题,详见程序员编程艺术系列第二章:http://blog.csdn.net/v_JULY_v/article/details/6347454)。 -
检索一英语全文,顺序输出检测的单词和单词出现次数。
- 今天10.15下午网易游戏笔试题:给一个有序数组array[n],和一个数字m,判断m是否是这些数组里面的数的和。(类似于微软面试100题2010年版第4题,即相当于给定一棵树,然后给定一个数,要求把那些 相加的和等于这个数的 所有节点打印出来)。前后双指针扫描
- 一个淘宝的面试题
文件A:
uid username
文件B:
username password?????
文件A是按照uid有序排列的,要求有序输出合并后的A,B文件,格式为uid username password(A B 两个文件都很大,内存装不下。) - 百度可能会问问memcached(可下载此份文档看看:http://tech.idv2.com/2008/08/17/memcached-pdf/。源码下载地址:http://www.oschina.net/p/memcached),apache之类的。http://baike.baidu.com/link?url=PA9hPDg1qH46JWXY6PkVwvWHAAgKDOR9z2ZmRV6KXBxVbWVvZE3uwYUdbeOUX1pf
- 今上午10.16百度笔试:1.C++ STL里面的vector的实现机制。 好好看看STL中的几个容器实现
(1)当调用push_back成员函数时,怎么实现?(粗略的说@owen,内存足则直接 placement new构造对象,否则扩充内存,转移对象,新对象placement new上去。具体的参见此文:http://blog.csdn.net/v_july_v/article/details/6681522)
(2)当调用clear成员函数时,做什么操作,如果要释放内存该怎么做。(调用析构函数,内存不释放。 clear没有释放内存,只是将数组中的元素置为空了,释放内存需要delete。)
2. 函数foo找错,该函数的作用是将一个字符串中的a-z的字母的频数找出来
void foo(char a[100],int cnt[256])
{
memset(cnt ,0, sizeof(cnt)); //sizeof(cnt)==4
while (*a!='\0')
{
++cnt[*a]; //当a为汉字时,编码范围超越了0-255 为负数
++a;
}
for ( char c='a';c<='z';++c)
{
printf("%c:%d\n",c,cnt[c]);
}
}
int main()
{
char a[100]="百度abc";
int cnt[256];
foo(a,cnt);
return 0;
} - 腾讯长沙笔试:旅行商问题。
- 今天完美10.16笔试题:2D平面上有一个三角形ABC,如何从这个三角形内部随机取一个点,且使得在三角形内部任何点被选取的概率相同。
-
不用任何中间变量,实现strlen函数/* 不用中间变量,用递归实现,很容易看懂 */
/* 不用中间变量,用递归实现,很容易看懂 */ int NoMallocStrlen(const char *str) { if(str == NULL) return 0; if ('\0' == *str) return 0; else return NoMallocStrlen(str+1) + 1;
- 笔试:联合赋值问题:#include <stdio.h>
union A{
int i;
char x[2];
}a;
int main()
{
a.x[0]=10;
a.x[1]=1;
printf("%d\n",a.i);
return 0;
} //得先问清楚大小端啊
sizeof(a) = sizeof(int) = 4 byte
4 * 8 = 32 bit
a = > 00000000 00000000 00000000 00000000
a.x[0]=10 => 00000000 00000000 00000000 00001010
a.x[1]=1 => 00000000 00000000 00000001 00001010
a.i = 1*256 + 1*8 + 1*2 = 256+10 = 266 - 昨天做了中兴的面试题:
struct A{
int a;
char b;
char c;
};
问sizeof(A)是多大? 8,不过有些情况与编译器、系统等有关 -
你好:
今天5月6日百度笔试,遇到一个题目,没想到比较好的思路 在网上看了不太明朗,,希望你帮我解答下
题目如下: 不懂??!!
百度研发笔试题。设子数组A[0:k]和A[k+1:N-1]已排好序(0≤K≤N-1)。试设计一个合并这2个子数组为排好序的数组A[0:N-1]的算法。要求算法在最坏情况下所用的计算时间为O(N),只用到O(1)的辅助空间。
若论这道题的来源,则是在高德纳的计算机程序设计艺术第三卷第五章排序中,如下(第一张图是原题,第二张图是书上附的答案): -
百度实习生笔试题:一个单词如果交换其所含字母顺序,得到的单词称为兄弟单词,例如mary和army是兄弟单词,即所含字母是一样的,只是字母顺序不同,用户输入一个单词,要求在一个字典中找出该单词的所有兄弟单词,并输出。给出相应的数据结构及算法。要求时间和空间复杂度尽可能低目前思想:struct {char data;int n};根据数学定理:任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积 N=(P_1^a1)*(P_2^a2)......(P_n^an) , 这里P_1<P_2<...<P_n是质数,且唯一。例如a=2 b=3 c=5 d=7 e=11...f(abcd)=2*3*5*7=210然后字典里找乘积210的位数相同的一定是这5个字母组合的单词就是兄弟单词
- 更新至2012.05.06下午.....
更多面试题,参见横空出世,席卷Csdn--评微软等数据结构+算法面试100题 (在此文中,集结了本博客已经整理的236道面试题)。
后记
此些面试题看多了,自然会发现题目类型可能会千变万化,但解决问题的思路却只有那么几种。再者,写代码的时候,很多的细节需要务必注意,如返回值,函数参数的检查,特殊情况的处理等等,这是一个代码规范性的问题。有个消息:
- 微软面试全部100题的答案如今已由一朋友阿财做出,微软面试100题2010年版全部答案集锦:http://blog.csdn.net/v_july_v/article/details/6870251,供诸君参考。
ok,日后一有最新的面试题,再整理,有任何问题,欢迎在本文评论下指出或来信指导(zhoulei0907@yahoo.cn),谢谢。July、2012.05.08。