首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

昨天百度笔试题没探讨的吗?解决思路

2013-10-21 
昨天百度笔试题没探讨的吗?这个应该不需要什么保密的吧。。。一1.线程或数据库死锁的原理?如何避免?2.面向对

昨天百度笔试题没探讨的吗?
这个应该不需要什么保密的吧。。。

1.线程或数据库死锁的原理?如何避免?

2.面向对象的3个基本要素和5个基本设计原则。

3.windows内存管理机制有哪几种?优缺点?

二、算法题
1.1001个员工羽毛球比赛,单淘汰制,求比几场能比出冠军(代码模拟过程)?

2.100个灯,初始状态亮着,第一次每隔一个灭一个,第二次每隔两个(如果是亮的就灭,反之亮之)。。。依次类推,100次后还剩几个亮着?

3.字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)

三、设计(这题记不大清楚了)
要把10W条数据放进内存,每条数据包括一个key(16字节),一个数据1M,6台电脑,每台64g内存,设计一个存储系统要满足7*24小时运行。(有可能会宕机)

话说上学地方偏僻的应届生找工作真心纠结。。。
[解决办法]
前面不用说了

第一个   锦标赛排序
第二个   感觉题目说得不清楚  下一次灭灯到底是从哪开始啊
第三个   先把翻转前n-3个 然后翻转后3个 也可以先后后前  如 ABCDEFG -> DCBA GFE -> EFGABCD 这样就OK了 来自《编程艺术》

后面的不知道
[解决办法]
2.100个灯,初始状态亮着,第一次每隔一个灭一个,第二次每隔两个(如果是亮的就灭,反之亮之)。。。依次类推,100次后还剩几个亮着


#include <iostrem>
using namespace std;

int main()
{
const int SIZE=100;
int ct=0;
int n=1;
//初始化pt数组为0
int pt[SIZE]={0};
//运行100次
for(int x=0;x<100;x++)
{
//每次间隔+1
n++;
for(int y=0;y<SIZE;y+=n)
{
if(pt[y]==0)
pt[y]=1;
else
pt[y]=0;
}
}
//记录亮灯数ct
for(int i=0;i<SIZE;i++)
{
if(pt[i]==0)
ct++;
}
cout<<"亮灯:"<<ct<<endl;
cout<<"Done!\n";
return 0;
}


[解决办法]
第三大题说白了就是要自动调度存储,6台电脑可能宕机需要保证7*24小时运行必须在某台或某几台无法工作的时候将任务分配给其它机器。

需要几个要点:
1、任务需要按照机器的负载情况(任务数、剩余空间)自动分配。
2、可以使用得分机制,比如分高的优先分配任务。
3、互相之间有心跳机制,用以检测是否有机器宕机。
4、100G的数据其实2台机器就足够了,所以只要保证存完前有2台机器正常就能完成任务,不知道是不是楼主笔误。
5、自动调度按普通的做法是需要一个主调度服务器的,从这个题目看的话如果没有的话那就需要6台机器的程序完成一个集群调度功能。
[解决办法]
最后一个设计题,其实就是一个小型的分布式储存,100G的数据,384G的空间,可以将每个数据存三份replica,用一致性哈希算法把数据分区,一般来说,有2个node同时fail也可以保证正确的读写。为数据加上时钟向量,可以解决数据冲突和数据恢复。通过心跳包检测failed节点。其实dynamo就可以满足要求。
[解决办法]
点灯那题好老了,据说是微软2000年左右的面试题


实际就是平方数最后是开的
[解决办法]
算法题目都好简单啊
1.1001个员工羽毛球比赛,单淘汰制,求比几场能比出冠军(代码模拟过程)?
一场比赛淘汰一个人.1001 -1 = 1000场
2.100个灯,初始状态亮着,第一次每隔一个灭一个,第二次每隔两个(如果是亮的就灭,反之亮之)。。。依次类推,100次后还剩几个亮着?
我理解为第N次是将被N+1整除的等都反转.
任何一个n,有
n=a1*b1 = a2* b2 = ......
如果是素数,就只会被翻转一次(第n次翻转)必定灭
如果不是素数,则每一个ai的翻转都会有对应的bi翻转,回到初始状态,直到第n次翻转,就第n盏灯灭了
除非出现ai=bi,也就是n是平方数,到最后才会保持亮灯


3.字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)
先整个字符串逆转GFEDCBA,再第三个字符串为分解分解成两个子字符串,内部逆转
[解决办法]
2.100个灯,初始状态亮着,第一次每隔一个灭一个,第二次每隔两个(如果是亮的就灭,反之亮之)。。。依次类推,100次后还剩几个亮着?

解(一):




#include <stdio.h>
#include <math.h>

#define N 100 //灯的总数

int main(void)
{
int sum = 0;//用来累计熄灭的灯的个数
int i;

for(i = 1; i <= N;i++)
{
if((int)(sqrt(i)) * (int)(sqrt(i)) == i)//如果该灯的编号为完全平方数,则有奇数个约数,处于熄灭状态
{
sum++;
}
}

sum = N - sum;

printf("还剩下%d栈灯亮着\n",sum);

return 0;
}

解(二)(其实就是解一演变):

#include <stdio.h>
#include <math.h>

#define N 100 //灯的总数

int main(void)
{
int sum = 0;//用来累计熄灭的灯的个数
sum = N - int(sqrt(N));
printf("还剩下%d栈灯亮着\n",sum);
return 0;
}


解法:
约数的奇数个数即是灭灯数 
而 int (sqrt (N))  即是N的约数的奇数个数
i = int (sqrt (100))  
i 即灭灯数 


以前做挑战赛时写的,希望对LZ有帮助.

热点排行