迅雷2010校园招聘吉林大学第二次笔试题

 

题目转自:http://blog.csdn.net/morre/archive/2009/09/01/4509390.aspx

迅雷2010校园招聘吉林大学第二次笔试题

答题时间: 2小时,请将答案写在答题纸上
一. 有n个文件的长度记载在一个无符号64 位整数数组中unsigned __int64 file_length[n],把这n 个文件从逻辑上按序首尾拼接在一起形成一个逻辑上的大文件,然后以每块长度为unsigned block_length把这个逻辑上的大文件划分成大小相等的数据块(当然,最后一块有可能比block_length小),请定义和实现一个函数,把 边界块的序号集合返回给函数的调用者(第一个数据块序号为0)。
注:边界块指的是跨多个文件的数据块。(30分)


二. 请实现一个函数,把两个从大到小的有序链表合并成一个链表,新的链表是一个从小到大的有序链表。
struct list
{
int value;
list* next;
};
list * merge (list *list1_head, list *list2_head);
(30分)


三. 如果两个英文单词,组成它们的字符集合相同,而且相同字符出现的次数也相同,则称这两个词匹配:比如说:同”abbc”与词”babc”是匹配的。有一个 词典,存储在字符串数组const char* dictionary[n]中,数组的每一个元素是一个词。对于任意给出的句子。句子中的单词使用空格分割。请实现以下函数,判断句子中是否有词和词典中 的词匹配。
bool is_matching( const char* dictionary[], int n, const char* sentence);
(40分)


注意:这一题需要先描述思路,再写程序,没写思路扣10分。


=================================================================


1.实现memcpy(void* dest,const void*src,unsigned int count)
2.合并两个链表Lsit* merge(List *l1,List*l2),合成的新链表要以data从大到小有序
3.实现字符串转换"I love thisgame"转换成"game this love I",char* convert(char* s)
4.实现一个高效率的程序(包括所需程序代码),以尽量短的时间,将用户信息表中150张按照时间hash的表(每张表的数据量为100万,数据字段包含《最近修改时间戳/username/nickname/出生地/所在地/年龄/性别/自我介绍》),转换成按照username hash的100张表。转换过程方法和过程需要考虑:
a)尽可能短的时间中断用户服务;
b)尽可能少的使用机器内存。
要求先写编程思路,再写代码,还有适当的注释
除了第一题外,都是考数据结构的,自己也是偶尔在网上做了迅雷的在线题,通过后才会去做笔试(迅雷派人到武汉来了),不过感觉应该是大三的去比较合适,自己大二还不太适合,呵呵。
当时做的时候感觉做的不太好,用STL编程太入迷了,结果很多基础的东西都没处理好,不过通过这次笔试,发现基础真的很重要。
不明白为什么招C++工程师居然不考STL,难道STL有些公司不喜欢用,迅雷网上试题考C++的东西也很少,大部分是C语言的东西(不过基础一定要好)。
现在又发现了Boost,不知道自己学的有没有用,哎,郁闷啊,难道一定要去搞Java吗,下学期有Java 的课程,还要在语言上花很多时间啊....还有算法分析与设计的课程,觉得这才是重点与难点,要加油啊。

1、选择题30道
如char a=123;
a=a|057;
printf("%d%o/n",a,a);之类
2、简答
(1)  static的特点
(2)引用和指针的区别
(3)记不起来了
(4)如何使图像变得平滑
3、编程题
(1)内存复制
(2)有效管理类
(3)两数组的中位数,时间复杂度o(lg n)

附(1):

     
  void   memcpy(void*   pvTo,  void*   pvFrom,   size_t   size) 
  { 
  void*   pbTo   =  (byte*)pvTo; 
  void*   pbFrom   =  (byte*)pvFrom; 
  ASSERT(pvTo   !=   NULL  &&   pvFrom   !=   NULL);   //检查输入指针的有效性 
  ASSERT(pbTo>=pbFrom+size   ||  pbFrom>=pbTo+size);//检查两个指针指向的内存是否重叠 
  while(size-->0) 
  *pbTo++   ==   *pbFrom++; 
  return(pvTo); 
  } 

void   *  memcpy(void   *s,   const   void  *s0,   size_t   n) 
             { 
             if   (n   !=   0)   { 
           char   *s1   =   s; 
           const   char   *s2   =  s0; 
          
          do  { 
          *s1++  =   *s2++; 
          }  while   (--n   !=   0); 
           } 
           return   (s); 
           } 
各种情况包括:
1、参数是指针,检查指针是否有效
2、检查复制的源目标和目的地是否为同一个,若为同一个,则直接跳出
3、读写权限检查
4、安全检查,是否会溢出
memmove考虑重叠问题


1. 给你10台机器,每个机器2个cpu,2g内存,现在已知在10亿条记录的数据库里执行一次查询需要5秒,问用什么方法能让90%的查询能在100毫秒以内返回结果。

2. 一个长度为10000的字符串,写一个算法,找出最长的重复子串,如abczzacbca,结果是bc。

3. 一个保存有10000个URL的文本文件,删除其中相同的URL。

4. 连接两个单向链表,返回排序后的结果。

5. 将9个石子放在9x9的方格中,要求同行、同列、45度上无两个石子。

6. 有一幢100层高的大楼,给你两个完全相同的玻璃围棋子。假设从某一层开始,丢下玻璃棋子就会破碎。那么怎么利用手中的两颗棋子,用一种什么样的最优策略,知道这个临界的层高呢?

7. 用c++写一个函数,如Foo(const   char   *str),打印出str的全排列,如abc的全排列:abc, acb, bca, dac, cab,cba

8. 求出一字符串中最长的数字串。比如as123cdf1234f,返回1234,char* FindNumber(char * out,char *in)。

迅雷笔试题 /*定义循环左移函数(我没有用左移函数)*/
{
int i,j;
char temp=str[0];
for (i=0;i<m;i++) str=str[i+1];
str=temp;
}
void pai(char str[],int m,int n) /*定义全排列函数*/
{ int k;
void chang(char str[],int m);
if (m<n) /* 定 义 递 归 调 用 出 口 */
{
for (k=0;k<=m;k++)
{
pai(str,m+1,n); /*递归调用*/
chang(str,m); /*调用左移函数*/
}
}
else printf("%s/t",str);
}
1.
include "stdio.h"
main()
{char str[]="ABCD"; /*全排列字符,可以任意多个(相应的下面排列函数中参数"4"改成全排列字符的个数)*/ clrscr();pai(str,0,4); /*这里参数0(下标)表示从第一个元素开始,4表示元素个数(不是下标)*/ getch();
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
今天在家看碟,突然接到迅雷一个电话让我去笔试。遇到两个很有意思的题目,现有奖征集第一题的答案:B1套餐一份。

1.<征集答案>给你10台机器,每个机器2个cpu,2g内存,现在已知在10亿条记录的数据库里执行一次查询需要5秒,问用什么方法能让90%的查询能在100毫秒以内返回结果。

2.一个长度为10000的字符串,写一个算法,找出最长的重复子串,如abczzacbca,结果是bc。最后就做出这一道题目,时间复杂度为O(n!), 空间复杂度为O(n)。如果有更好的算法,还请指教。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
凭印象了:


算法题:

1.连接两个单向链表,返回排序后的结果。

2.一个保存有10000个URL的文本文件,删除其中相同的URL。

思路1:使用bloom filter算法,有误判

思路2:hash_map

 

3.将9个石子放在9x9的方格中,要求同行、同列、45度上无两个石子。

 

 

 

 

智力题:

1.一笔画四条直线穿过3x3的9个点。

对于: 
1 2 3
4 5 6
7 8 9
这样9个点。
那么
第一线:4-7并且出头一些
第二线:向右上方折回,经过8-6并且再出头一些,直到横向与最上面一行对齐
第三线:向左折回经过3、2,到达1
第四线:向右下划出连通1、5、9

2.国王给三个囚犯每人戴了一顶帽子,帽子不是黑色就是白色,并且告诉囚犯们谁看到其它两个人都是白帽子或者知道自己戴的是黑帽子,谁就能被释放。囚犯们能看到其它的人帽子颜色,但是看不到自己的帽子颜色。过了一段时间,三个囚犯都没有说话,其中一个聪明的囚犯立刻肯定自己戴的是黑帽子,你知道为什么吗?

 

 

 

 

 

3.有16个硬币,A和B轮流拿,每次拿的个数只能是1,2,4之一,谁最后拿谁就输。问可以保证赢吗?

上机题:

nxn的方格,去掉一条对角线的两个对角,余下部分用面积为2的矩形覆盖,即1x2或2x1的矩形,结果是不可能完全覆盖,请编程枚举所有的覆盖情况

 

 

 

 

 

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
一个猴子,身带100个香蕉,他距离家50米.   这个猴子要带香蕉回去.但是他一次最多只能背50个香蕉.
而且,每走一米他就要吃掉一个香蕉(往回走也要吃香蕉).
问:这个猴子最后最多可以带多少个香蕉到家.
能不能推广到其他情况,例如500个香蕉100米?



、、、、、、、、、、、、、、、、、、、、、、、、、、、
3 人戴 5 个帽子,三蓝两红,自己看不到自己的帽子,只能看到别人的.提问时,前两个人都说不知道自己什么颜色,第三个人居然知道.
我没看到原题, 不过我觉得这道题应该有一个漏掉的说明: 每人只能戴1顶帽子. 否则,这道题目就挺繁琐了. 另外, 题目要问的可能是: 这三个人分别戴了什么颜色的帽子?
我的解(从第1个人到第3个人):
1. 蓝, 蓝, 蓝

2. 红, 红, 蓝

3. 蓝, 红, 蓝

4. 红, 蓝, 蓝

另外, 如果考虑每个人至少戴1顶帽子, 最多3顶帽子的话, 还要加上如下情况:
1. (红, 蓝), (红, 蓝), 蓝

2. (红, 蓝), 红, 蓝

3. (红, 蓝), 蓝, 蓝

4. 红, (红, 蓝), 蓝

5. 蓝, (红, 蓝), 蓝


一. 有n个文件的长度记载在一个无符号64位整数数组中unsigned__int64 file_length[n],把这n 个文件从逻辑上按序首尾拼接在一起形成一个逻辑上的大文件,然后以每块长度为unsigned block_length把这个逻辑上的大文件划分成大小相等的数据块(当然,最后一块有可能比block_length小),请定义和实现一个函数,把边界块的序号集合返回给函数的调用者(第一个数据块序号为0)。
注:边界块指的是跨多个文件的数据块。(30分)

二. 请实现一个函数,把两个从大到小的有序链表合并成一个链表,新的链表是一个从小到大的有序链表。
struct list
{
int value;
list* next;
};
list * merge (list *list1_head, list*list2_head);
(30分)

三. 如果两个英文单词,组成它们的字符集合相同,而且相同字符出现的次数也相同,则称这两个词匹配:比如说:同”abbc”与词 ”babc”是匹配的。有一个词典,存储在字符串数组const char* dictionary[n]中,数组的每一个元素是一个词。对于任意给出的句子。句子中的单词使用空格分割。请实现以下函数,判断句子中是否有词和词典中的词匹配。
bool is_matching( const char* dictionary[],int n, const char* sentence);
(40分)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值