首页 最新 热门 推荐

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

在2.5亿个整数中找出不重复的整数的C++实现源代码

  • 25-02-17 10:01
  • 4667
  • 6297
blog.csdn.net
  6、在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。

  方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。

  方案2:也可采用与第1题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。

  7、腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

  与上第6题类似,我的第一反应时快速排序+二分查找。以下是其它更好的方法: 方案1:oo,申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。(与第6题类似)

 

  1. // TestSTL.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include
  5. #include
  6. #include
  7. #include
  8. using namespace std;
  9. #define TestArrayLen (100)//多少个数
  10. #define RangeValue (100)//取值范围
  11. #define BitsPerInt (32)//Int类型所占位数,int类型改为位存储
  12. #define BitsPerNum (BitsPerInt/2)//一个数用2位存储==原一个int类型的整数空间(4字节)可以存储16个数
  13. #define BitArrayLen (1+RangeValue/BitsPerNum)//所需位数组长度
  14. //bitset bitArray[BitArrayLen];
  15. bitset* bitArray=new bitset[BitArrayLen];
  16. int _tmain(int argc, _TCHAR* argv[])
  17. {
  18. int* data=new int[TestArrayLen];
  19. memset(data,0,TestArrayLen);
  20. //生成1-TestArrayLen之间的随机数
  21. for (int i=0; i
  22. {
  23. srand(GetTickCount());
  24. data[i]=rand()%RangeValue+1;
  25. cout << data[i] << " ";
  26. if ((i+1)%10==0)
  27. {
  28. cout << endl;
  29. }
  30. }
  31. int roundNum=0;//取整
  32. int remainNum=0;//取余
  33. //数据在位图中进行存储,即位图排序
  34. for (int j=0; j
  35. {
  36. roundNum=(data[j]-1)/BitsPerNum;
  37. remainNum=(data[j]-1)%BitsPerNum;
  38. if (bitArray[roundNum][remainNum*2]==1 || bitArray[roundNum][remainNum*2+1]==1)//如果为01,设为10;本来为10,不变
  39. {
  40. bitArray[roundNum].set(remainNum*2+1,1);
  41. bitArray[roundNum].set(remainNum*2,0);
  42. }
  43. else//如果为00,设为01
  44. {
  45. bitArray[roundNum].set(remainNum*2,1);
  46. }
  47. }
  48. //位图排数,输出所有重复的数
  49. cout << "所有重复的数:";
  50. for (int k=0;k
  51. {
  52. for (int l=0;l
  53. {
  54. if (bitArray[k][2*l+1]==1)
  55. {
  56. cout << k*BitsPerNum+l+1 << " ";
  57. }
  58. }
  59. }
  60. cout << endl;
  61. //位图排数,输出所有不重复的数
  62. cout << "所有不重复的数:";
  63. for (int m=0;m
  64. {
  65. for (int l=0;l
  66. {
  67. if (bitArray[m][2*l]==1)
  68. {
  69. cout << m*BitsPerNum+l+1 << " ";
  70. }
  71. }
  72. }
  73. cout << endl;
  74. system("pause");
  75. return 0;
  76. }


大家有更好的办法欢迎指出。。。大家有更好的办法欢迎指出。。。大家有更好的办法欢迎指出。。。大家有更好的办法欢迎指出。。。大家有更好的办法欢迎指出。。。

 

 

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

/ 登录

评论记录:

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

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (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-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top