百度2011招聘笔试题+答案解析

百度2011招聘笔试题+答案解析

一、算法设计

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]、[312]
 求一个组合函数。

 

 

参考答案(欢迎讨论)转载请注明来源http://www.cnblogs.com/jerry19880126/

一、算法设计

1. 如下:

View Code
复制代码
 1 int count = 0;
 2 while( count < n)
 3 {
 4     x = rand(-R, R);
 5     y = rand(-sqrt(R*R-x*x), sqrt(R*R-x*x));
 6     if(x*x + y*y != R*R) //排除正好落在圆上的情况
 7     {
 8         ++ count;
 9     }
10 }
复制代码

2. 不会,转网友的方法:

思路:如果用户查询的数量小于m,那么直接就存起来。如果用户查询的数量大于m,假设为m+i,那么在1-----m+i之间随机产生一个数,如果选择的是前面m条查询进行存取,那么概率为m/(m+i),如果选择的是后面i条记录中的查询,那么用这个记录来替换前面m条查询记录的概率为m/(m+i)*(1-1/m)=(m-1)/(m+i),当查询记录量很大的时候,m/(m+i)== (m-1)/(m+i),所以每个query被抽中的概率是相等的。

3.

(1)

若size < capacity, 则直接将数加入数组中,a[size++] = 新数;

否则,分配新内存,首先capacity = capacity + delta;

delta = capacity / 2 > 1 ? capacity: 1;

temp = new T [capacity];

其次,复制旧元素内容至新内存

copy a to temp

最后,释放旧内存, delete [] a; a = temp;

并把追加新数 a[size++] = 新数。

 

(2)

调用clear时,内存并不释放,只是作了size = 0 的处理。

释放内存已经由vector底层做好,用户一般不用去管,若要强行释放,可以用swap方法,交换迭代器的地址。

即:

v.swap(vector<T>()),可以释放v的内存。

 

 二、系统设计

不会

 

三、求全排列

View Code
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int n = 0;  
 5 
 6 void swap(int *a, int *b) 
 7 {     
 8     int m;     
 9     m = *a;     
10     *a = *b;     
11     *b = m; 
12 }  
13 void perm(int list[], int k, int m) 
14 {     
15     int i;     
16     if(k > m)     
17     {          
18         for(i = 0; i <= m; i++)             
19         {
20             printf("%d ", list[i]);
21         }
22         printf("\n");         
23         n++;     
24     }     
25     else     
26     {         
27         for(i = k; i <= m; i++)         
28         {             
29             swap(&list[k], &list[i]);             
30             perm(list, k + 1, m);             
31             swap(&list[k], &list[i]);         
32         }     
33     } 
34 } 
35 int main() 
36 {     
37     int list[] = {1, 2, 3, 4, 5};     
38     perm(list, 0, 4);     
39     printf("total:%d\n", n);     
40     return 0; 
41 } 
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值