📜  门| GATE CS Mock 2018 |设置 2 |第 30 题(1)

📅  最后修改于: 2023-12-03 15:12:38.099000             🧑  作者: Mango

GATE CS Mock 2018 - 设置 2 - 第 30 题

这是一道关于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