题目:来自脑客爱刷题
//假设key是double类型
class RandomPool
{
public:
//cur_index记录当前插入的次序,恰好也是哈希表中已有记录的个数 KeyToIndex.size()
int cur_index;
//维护两张哈希表
hash_map<double, int> KeyToIndex;
hash_map<int, double> IndexToKey;
//cur_index初始化为0,即第一个插入的key的次序是0
RandomPool() :cur_index(0){}
bool Insert(const double key)
{
if (KeyToIndex.find(key) != KeyToIndex.end())
return false;
KeyToIndex.emplace(key, cur_index);
IndexToKey.emplace(cur_index, key);
cur_index++;
}
//delete操作是本题关键
bool Delete(const double key)
{
if (KeyToIndex.find(key) == KeyToIndex.end())
return false;
int deleteindex = KeyToIndex[key];
cur_index--;
double keylast = IndexToKey[cur_index];
KeyToIndex.erase(key);
KeyToIndex.erase(keylast);
IndexToKey.erase(deleteindex);
IndexToKey.erase(cur_index);
KeyToIndex.emplace(keylast, deleteindex);
IndexToKey.emplace(deleteindex, keylast);
return true;
}
double getRandom()
{
//随机生成一个数random,范围是 [0,cur_index-1]
int random = rand() % cur_index;
return IndexToKey[random];
}
};