各大计算机公司 笔试及面试 题目 - 腾讯

备注: 转至 周磊的博客,http://blog.csdn.net/v_JULY_v/article/details/6234496


1、请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句

2、两个数相乘,小数点后位数没有限制,请写一个高精度算法

3、有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内这四个人都过桥?

4、有12个小球,外形相同,其中一个小球的质量与其他11个不同,
给一个天平,问如何用3次把这个小球找出来,并且求出这个小球是比其他的轻还是重

5、在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。

6、一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数

7、腾讯服务器每秒有2w个QQ号同时上线,找出5min内重新登入的qq号并打印出来。


8、给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数,要求下排每个数都是先前上排那十个数在下排出现的次数。 
上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】

举一个例子:
                    数值: 0,1,2,3,4,5,6,7,8,9 
                    分配: 6,2,1,0,0,0,1,0,0,0 
                   0在下排出现了6次,1在下排出现了2次, 
                   2在下排出现了1次,3在下排出现了0次.... 
以此类推..


9、设计一个魔方(六面)的程序。

10、有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用5分钟时间,找出重复出现最多的前10条。


11、收藏了1万条url,现在给你一条url,如何找出相似的url。(面试官不解释何为相似)


12、 在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符“*”表示零个或多个任意字母,通配符“?”表示一个任意字母。 如:“J* Smi??” 可以匹配“John Smith” .


请用C语言实现如下函数:
void scan(const char* pszText, const char* pszName);

注:pszText为整个文章字符,pszName为要求匹配的英文名。请完成些函数实现输出所有匹配的英文名,除了printf外,不能用第三方的库函数等。


解决方法一:(此段代码已经多个网友指出,bug不少,但暂没想到解决办法):

  1. //copyright@ falcomavin && July  
  2.   
  3. //updated:  
  4. //多谢Yingmg网友指出,由于之前这代码是从编译器->记事本->本博客,辗转三次而来的,  
  5. //所以,之前的代码不符合缩进规范,  
  6. //特此再把它搬到编译器上,调整好缩进后,不再放到记事本上,而是直接从编译器上贴到这里来。  
  7.   
  8. //July,说明。2011.04.17。  
  9. #include <iostream>  
  10. using namespace std;  
  11.   
  12. int scan(const char* text, const char* pattern)  
  13. {  
  14.     const char *p = pattern;    // 记录初始位置,以便patten匹配一半失败可返回原位  
  15.     if (*pattern == 0) return 1;    // 匹配成功条件  
  16.     if (*text == 0) return 0;    // 匹配失败条件  
  17.       
  18.     if (*pattern != '*' && *pattern != '?')  
  19.     {  
  20.         if (*text != *pattern)    //如果匹配不成功    
  21.             return scan(text+1, pattern);    //text++,寻找下一个匹配  
  22.     }  
  23.       
  24.     if (*pattern == '?')  
  25.     {  
  26.         if (!isalpha(*text))    // 通配符'?'匹配失败  
  27.         {  
  28.             pattern = p;    // 还原pattern初始位置  
  29.             return scan(text+1, pattern);    //text++,寻找下一个匹配  
  30.         }  
  31.         else                    // 通配符'?'匹配成功  
  32.         {  
  33.             return scan(text+1, pattern + 1);  //双双后移,++  
  34.         }  
  35.     }  
  36.     return scan(text, pattern+1);    // 能走到这里,一定是在匹配通配符'*'了  
  37. }  
  38.   
  39. int main()  
  40. {  
  41.     char *i, *j;  
  42.     i = new char[100];  
  43.     j = new char[100];  
  44.     cin>>i>>j;  
  45.     cout<<scan(i,j);  
  46.     return 0;  
  47. }  


解决方法二:

  1. //qq120848369:  
  2. #include <iostream>  
  3. using namespace std;  
  4. const char *pEnd=NULL;  
  5.   
  6. bool match(const char *pszText,const char *pszName)  
  7. {  
  8.     if(*pszName == '/0')    // 匹配完成  
  9.     {  
  10.         pEnd=pszText;  
  11.         return true;  
  12.     }  
  13.    
  14.     if(*pszText == '/0')    //    未匹配完成  
  15.     {  
  16.         if(*pszName == '*')  
  17.         {  
  18.             pEnd=pszText;  
  19.             return true;  
  20.         }  
  21.     
  22.         return false;  
  23.     }  
  24.    
  25.     if(*pszName!= '*' && *pszName!='?')  
  26.     {  
  27.         if(*pszText == *pszName)  
  28.         {  
  29.             return match(pszText+1,pszName+1);  
  30.         }  
  31.     
  32.         return false;  
  33.     }  
  34.     else  
  35.     {  
  36.         if(*pszName == '*')  
  37.         {  
  38.             return match(pszText,pszName+1)||match(pszText+1,pszName);   
  39.              //匹配0个,或者继续*匹配下去  
  40.         }  
  41.         else  
  42.         {  
  43.             return match(pszText+1,pszName+1);  
  44.         }  
  45.     }  
  46. }  
  47.   
  48. void scan(const char *pszText, const char *pszName)  
  49. {  
  50.     while(*pszText!='/0')  
  51.     {  
  52.         if(match(pszText,pszName))  
  53.         {  
  54.             while(pszText!=pEnd)  
  55.             {  
  56.                 cout<<*pszText++;  
  57.             }  
  58.      
  59.             cout<<endl;  
  60.         }    
  61.         return;  
  62.     }  
  63. }  
  64.   
  65. int main()  
  66. {  
  67.     char pszText[100],pszName[100];  
  68.    
  69.     fgets(pszText,100,stdin);  
  70.     fgets(pszName,100,stdin);  
  71.     scan(pszText,pszName);  
  72.    
  73.     return 0;  
  74. }  

wangxugangzy05:
这个是kmp子串搜索(匹配),稍加改造,如 abcabd*?abe**??de这个窜,我们可以分成abcabd,?,abe,?,?,并按顺序先匹配abcabd,当匹配后,将匹配的文章中地址及匹配的是何子串放到栈里记录下来,这样,每次匹配都入栈保存当前子串匹配信息,当一次完整的全部子串都匹配完后,就输出一个匹配结果,然后回溯一下,开始对栈顶的子串的进行文中下一个起始位置的匹配。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值