题目:
本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。
void AdjustDown(vector<pair<string, int>* >& rel, size_t index)
{
size_t left = index * 2 + 1;
while (left < rel.size())
{
pair<string, int> *child = rel[left];
if (left + 1 < rel.size() && child->second > rel[left + 1]->second)
{
left++;
child = rel[left];
}
pair<string, int> *parent = rel[index];
if (parent->second > child->second)
{
rel[left] = parent;
rel[index] = child;
index = left;
left = index * 2 + 1;
}
else
break;
}
}
void GetFavoriteFruit( vector<string>& fruits, size_t k)
{
map<string, int> fru;
vector<string>::iterator itStart = fruits.begin();
while (itStart != fruits.end())
{
const char *c = (*itStart).c_str();
fru[c]++;
itStart++;
}
//水果和其出现的次数保存在fru中
vector<pair<string,int>* > rel;
/*容器调用resize()函数后,所有的空间都已经初始化了,所以可以直接访问。
而reserve()函数预分配出的空间没有被初始化,所以不可访问。*/
rel.reserve(k);
//size_t i = 0;
map<string, int>::iterator mapIt = fru.begin();
size_t i = 0;
pair<string, int> *cur = NULL;
for (; i < k; i++)
{
cur = new pair<string, int>(mapIt->first, mapIt->second);
rel.push_back(cur);
mapIt++;
}
for (int j = (k - 2) / 2; j >= 0; j--)
{
AdjustDown(rel, j);
}
while (mapIt != fru.end())
{
if (rel[0]->second < mapIt->second)
{
cur = new pair<string, int>(mapIt->first, mapIt->second);
rel[0] = cur;
AdjustDown(rel, 0);
}
mapIt++;
}
for (size_t i = 0; i < rel.size(); i++)
{
fruits[i] = rel[i]->first;
}
fruits.resize(k);
}
void TestFindKElem()
{
vector<string> fr;
fr.push_back("苹果");
fr.push_back("香蕉");
fr.push_back("香蕉");
fr.push_back("香蕉");
fr.push_back("香蕉");
fr.push_back("西瓜");
fr.push_back("西瓜");
fr.push_back("西瓜");
fr.push_back("西瓜");
fr.push_back("西瓜");
fr.push_back("西瓜");
fr.push_back("苹果");
fr.push_back("草莓");
fr.push_back("草莓");
fr.push_back("草莓");
fr.push_back("草莓");
fr.push_back("草莓");
fr.push_back("草莓");
fr.push_back("草莓");
fr.push_back("草莓");
fr.push_back("草莓");
fr.push_back("草莓");
fr.push_back("葡萄");
fr.push_back("荔枝");
fr.push_back("荔枝");
fr.push_back("荔枝");
fr.push_back("芒果");
fr.push_back("芒果");
fr.push_back("芒果");
fr.push_back("芒果");
fr.push_back("芒果");
fr.push_back("芒果");
fr.push_back("芒果");
GetFavoriteFruit(fr, 4);
}