首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

腾讯2014软件开发笔试题目

  • 25-03-02 17:02
  • 3132
  • 9230
blog.csdn.net

腾讯2014软件开发笔试题目

                                                                    -----9月21日,腾讯2014软件开发校招-简答题-广州

简答题:

1、请设计一个排队系统,能够让每个进入队伍的用户都能看到自己在 中所处的位置和变化。队伍可能随时有人加入和退出,当有人退出影响到用户的位置排名时需要即时反馈到用户。

2、A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。

(博主能力有限,不是所有题目都会求解,第1题不是我的擅长,这里贴出来让大家知道腾讯的考题。我的重点放在第2题上面!)

 

第2题  题解(个人见解,仅供参考!)

思路1:排序法

  对集合A和集合B进行排序(升序,用快排,平均复杂度O(N*logN)),设置两个指针p和q,同时指向集合A和集合B的最小值,不相等的话移动*p和*q中较小值的指针,相等的话同时移动指针p和q,并且记下相等的数字,为交集的元素之一,依次操作,直到其中一个集合没有元素可比较为止。

  优点:操作简单,容易实现。

  缺点:使用的排序算法不当,会耗费大量的时间,比如对排好序的集合使用快排, 时间复杂度是O(N2)

  这种算法是大家都能比较快速想到的办法,绝大多数时间放在了对集合的排序上,快排的平均复杂度是O(N*logN),对排好序的集合做查找操作,时间复杂度为O(N),当然这种算法肯定比遍历要快多了。

code:

 

  1. #include
  2. #include
  3. #define M 8
  4. #define N 5
  5. int cmp(const void *a, const void *b)
  6. {
  7. int *x = (int *)a;
  8. int *y = (int *)b;
  9. return (*x) - (*y);
  10. }
  11. int main(void)
  12. {
  13. int A[] = {-1, 2 ,39 ,10, 6, 11, 188, 10};
  14. int B[] = {39 ,8 , 10, 6, -1};
  15. //对数组A和数组B进行快排
  16. qsort(A, M, sizeof(int), cmp);
  17. qsort(B, N, sizeof(int), cmp);
  18. //FindIntersection(A, B);
  19. int i = 0, j = 0;
  20. int cnt = 0;
  21. int result[M > N ? M : N];//保存集合的结果
  22. //设置i、j索引,分别指向数组A和B,相等则同时移动,不相等则移动较小值的索引
  23. while(i < M && j < N)
  24. {
  25. if(A[i] == B[j])
  26. {
  27. result[cnt] = A[i];
  28. i++;
  29. j++;
  30. cnt++;
  31. }
  32. else if(A[i] < B[j])
  33. {
  34. i++;
  35. }
  36. else
  37. {
  38. j++;
  39. }
  40. }
  41. for(i = 0; i < cnt; i++)
  42. {
  43. printf("%4d", result[i]);
  44. }
  45. return 0;
  46. }

 

 

思路2:索引法 

以空间换时间,把集合(感谢网友的指正,集合里面的元素是不重复的!)中的元素作为数组下表的索引。来看例子:      

A= {1 ,12, 13, 25},那Asub[1] = 3,Asub[12] = 1 ,Asub[13] = 1 ,Asub[25] = 1 ;

B={1, 2,  3, 15 ,}那Bsub[1] = 1; Bsub[2] = 1; Bsub[3] = 1; Bsub[15] = 1;

  对元素少的集合扫一遍,发现Asub[1] = 3 和Bsub[1] = 1有相同的索引1,并且重复度为1,所以交集肯定包括{1, 1}; Bsub[2] = 1而Asub[2] = 0,表示无交集,依次类推,可以得到集合A和B的交集。

  假设集合中存在负数,可以把集合分成正整数和负整数(加个负号变正整数)两部分,解法同上!

  优点:速度快,时间复杂度O(N)

  缺点:空间消耗大,以空间换取时间

  这是我看到题目第一个想到的算法,再来想到排序法,而集合压缩是有感而发的,索引法的缺点是空间消耗多,原因是可能索引值太大,要申请很多的不必要的空间,这个缺点也是有克服的方法的,就是采用哈希查找,找到一个比较合适的哈希函数,把索引的值减小了,从而减少消耗的内存空间。比如哈希函数为f(x) = (x + MOD) % MOD (除留余数法,MOD为常数),还有平方取中法、折叠法等方法,然而,无论哈希函数设计有多么精细,都会产生冲突现象,也就是2个关键字处理函数的结果映射在了同一位置上,因此,有一些方法可以避免冲突。这里没有仔细钻研,只提供一些思路,有兴趣的朋友可以继续研究。

code:(我的代码仅适用与正整数部分,未处理负数)

 

  1. /*
  2. Tencent: A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
  3. */
  4. #include
  5. #include
  6. #include
  7. #define M 6
  8. #define N 5
  9. int Mymin(int a, int b)
  10. {
  11. return a < b ? a : b;
  12. }
  13. int main(void)
  14. {
  15. int A[] = {1, 10, 12, 23, 5, 45};
  16. int B[] = {1, 10, 12, 123, 52};
  17. //find MaxNumber in A
  18. int ifindA = 0;
  19. int MaxInA = A[0];
  20. for(ifindA = 0; ifindA < M; ifindA++)
  21. {
  22. MaxInA = MaxInA > A[ifindA] ? MaxInA : A[ifindA];
  23. }
  24. //find MaxNumber in B
  25. int ifindB = 0;
  26. int MaxInB = 0;
  27. for(ifindB = 0; ifindB < M; ifindB++)
  28. {
  29. MaxInB = MaxInB > A[ifindB] ? MaxInB : A[ifindB];
  30. }
  31. int *AsubPositive = (int *)malloc(sizeof(int) * (MaxInA + 1));
  32. int *BsubPositive = (int *)malloc(sizeof(int) * (MaxInB + 1));
  33. memset(AsubPositive, 0, sizeof(int) * (MaxInA + 1));
  34. memset(BsubPositive, 0, sizeof(int) * (MaxInB + 1));
  35. //COPY Positive and Negative numbers of A
  36. int i = 0;
  37. for(i = 0; i < M; i++)
  38. {
  39. AsubPositive[A[i]]++;
  40. }
  41. //COPY Positive and Negative numbers of B
  42. int j = 0;
  43. for(j = 0; j < N; j++)
  44. {
  45. BsubPositive[B[j]]++;
  46. }
  47. int k = 0;
  48. int icount = 0;
  49. //扫描AsubNegative和BsubPositive
  50. printf("the Intersection of A and B is : { ");
  51. for(k = 0; k < M; k++)
  52. {
  53. //有交集输出该数
  54. icount = Mymin(AsubPositive[A[k]], BsubPositive[A[k]]);
  55. if(icount == 1)
  56. {
  57. printf("%-3d",A[k]);
  58. }
  59. A[k] = 0;
  60. }
  61. printf(" }");
  62. return 0;
  63. }

思路3:集合压缩

 

  对于一个集合来说,我们很容易就可以得到集合的最大值和最小值,假设集合A的最大值和最小值分别为MaxInA,MinInA;假设集合B的最大值和最小值分别为MaxInB,MinInB;那么集合A的所有元素一定在闭区间【MinInA, MaxInA】里面,集合B的所有元素一定在闭区间【MinInB, MaxInB】里面,从这两个集合里面我们可以作如下判断:(集合A和集合B都在链表中!此算法使用链表结构,操作起来比数组更方便)

  1. 若MinInA == MinInB或者MaxInA == MaxInB,那么MinInA 或者MaxInA (相等的那个数)就一定在交集里面,存入交集(可以用数组存),删除链表中相应的结点;若不想等则跳到第3步;

  2. 重新找到集合A和B中的最大值和最小值MinInA 、MaxInA 、MinInB、MaxInB;跳回第1步;

  3. 更新区间(交集的区间),区间的更新如下:区间下界为Lower = max(MinInA, MinInB),上届为Upper = min(MaxInA , MaxInB),那么剩下的交集一定在闭区间【Lower ,Upper】里面,按照这个区间来剔除掉集合A和集合B中不符合条件的元素,剔除结束后,若其中一个集合为空,跳到第4步,否则返回第2步;

  4. 程序结束,退出!

  这种适用于集合里面数值比较散乱,最大值最小值差值比较大的情况!算法的思想在于不断减小搜索的范围,时间的消耗主要在查找集合的最大值和最小值上,我们来看一个例子,集合A= {1, 3, 10, 100, 123, 0, 6} ,B = {3, 2, 10, 23, -1},

  集合A的闭区间【0, 123】,集合B的区间【-1,23】,交集的闭区间就为【0,23】,按照这个区间,剔除集合A中的{ 100, 123},剔除集合B的{-1},集合A={1, 3, 10, 0, 6}集合B={3, 2, 10, 23},没有相等的,继续缩小范围,为【2,10】,这时MaxInA == MaxInB,满足条件,把10存入交集数组中,剔除两个集合的结点;集合变为A= {3,6}集合B={3},满足MinInA == MinInB或者MaxInA == MaxInB,把3存入交集数组中,集合B为空,结束!如图:

  对于第三个方法,我只是把算法的思想做了一下总结,并没有编写代码运行调试并与其他算法做比较!比较过的朋友,欢迎告知三种算法的优劣性!

题目部分摘取自july CSDN网站:http://iyenn.com/rec/1691595.html 

注:1.本文版权归作者和CSDN所有,未经允许不得转载,侵权必究!

2.本博客与博客园上的博客为同一博客主:http://www.cnblogs.com/bestDavid/

后记:  

  只要是算法,就无法同时解决时间复杂度和空间复杂度这一矛盾,我们只能具体问题具体分析,根据实际情况选取最合适的算法,尽量保持程序高效的执行效率!我的写代码能力和算法能力只能算初学者级别,所以在贴出的代码中可能有许多漏洞,朋友们若是有什么建议,请多多给与我更多的指教!在这里发表一下自己的看法,多谢支持!

注:本文转载自blog.csdn.net的大卫david的文章"http://blog.csdn.net/thebestdavid/article/details/12056293"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top