📅  最后修改于: 2023-12-03 15:12:38.099000             🧑  作者: Mango
这是一道关于C++STL中list容器的问题,涉及到移除列表中特定元素的操作。
给定一个包含n个元素的列表(list),需要移除其中出现次数最少的元素。如果有多个出现次数最少的元素,则移除其中第一个元素。
例如,对于列表 L: {2, 2, 1, 3, 1}
,需要移除其中出现次数最少的元素。因为元素1和3都只出现过一次,所以需要移除其中一个1或者一个3。由于1在列表中出现的位置比3先,因此应该移除第一个出现的1。删除后的列表应为 L: {2, 2, 3, 1}
。
请编写一个函数,接受一个列表作为输入,返回移除出现次数最少的元素后的列表。
函数签名为:
list<int> remove_least_frequent(list<int> L)
L: {2, 2, 1, 3, 1}
{2, 2, 3, 1}
我们可以使用STL中的 unordered_map
(哈希表)来记录列表中每个元素出现的次数。具体地,我们可以遍历列表,将每个元素作为键(key)插入到unordered_map中,其对应的值(value)就是该元素出现的次数。遍历结束后,我们就可以得到每个元素出现的次数了。
接下来,我们可以再次遍历列表,找到出现次数最少的元素,并将它从列表中移除。为了方便,我们可以使用STL中的 list::erase
函数,它可以移除列表中指定位置的元素。
最后,我们返回移除元素后的列表即可。
具体实现见下方代码,其中用到了C++11的lambda表达式。
#include <iostream>
#include <list>
#include <unordered_map>
using namespace std;
list<int> remove_least_frequent(list<int> L) {
// 统计元素出现次数
unordered_map<int, int> freq;
for (auto x : L) {
freq[x]++;
}
// 找到出现次数最少的元素
auto least_frequent = L.begin();
for (auto it = L.begin(); it != L.end(); ++it) {
if (freq[*it] < freq[*least_frequent]) {
least_frequent = it;
}
}
// 移除出现次数最少的元素
L.erase(least_frequent);
return L;
}
int main() {
list<int> L = {2, 2, 1, 3, 1};
// 移除出现次数最少的元素
L = remove_least_frequent(L);
// 输出移除元素后的列表
for (auto x : L) {
cout << x << " ";
}
cout << endl;
return 0;
}
输出:
2 2 3 1