程序员面试金典: 9.10 扩展性与存储限制 10.4限定内存下寻找重复的数

来源:互联网 发布:风水峦头自学 知乎 编辑:程序博客网 时间:2024/06/05 09:38
#include <iostream>#include <stdio.h>#include <vector>#include <bitset>using namespace std;/*问题:给定一个数组,包含1到N的整数,N最大为32000,数组可能包含含有重复的值,且N的取值不定。若只有4KB内存可用,该如何打印数组中所有重复的元素分析:每次碰到内存少或大数据 一定要想到;1)分组,2)位图,3)批处理      书上的解法:4KB = 32* 1024 bit 大于32000,所以可以直接用位图处理输入:5(N) 7(实际输入元素个数)1 2 3 4 5 3 5输出:3 5关键:1 每次碰到内存少或大数据 一定要想到;1)分组,2)位图,3)批处理      书上的解法:4KB = 32* 1024 bit 大于32000,所以可以直接用位图处理2 mBitset.reset();//位向量设置每个位为0*/void process(){int N , inputNum;int value;const int MAXSIZE = 32000;bitset<MAXSIZE> mBitset;vector<int> repeatedNums;while(cin >> N >> inputNum){mBitset.reset();//位向量设置每个位为0for(int i = 0 ; i < inputNum ; i++){cin >> value;//将数据保存到位图中int bitValue = mBitset.at(value);if(1 == bitValue){repeatedNums.push_back(value);}else{mBitset.at(value) = 1;}}//输出结果int size = repeatedNums.size();for(int i = 0 ; i < size ; i++){cout << repeatedNums.at(i) << " ";}cout << endl;}}int main(int argc, char* argv[]){process();getchar();return 0;}

0 0