c++ - 获取给定数字集中具有相同数字频率的组数

标签 c++ algorithm

这是我在面试中遇到的一个问题,我想知道最好的方法是什么。 给出了一个数字列表,我们需要确定每个数字的数字具有相同频率的组数并打印这些组。例如: 例如,如果数字是: 1 10 3 33

有 4 个组:

G1={1}has one 1. 
G2={3} has one 3. 
G3={10}has one 1 and one 0. 
G4={33}as two 3s.

我正在考虑保留 map vector 。 map 将包含每个数字的频率。现在,当一个数字到来时,检查整个 vector 中是否存在与当前数字具有相同频率图的条目。如果存在则追加到列表中。我无法确定应该如何识别组以及打印它。有没有更好的方法来解决这个问题,因为我觉得我的解决方案效率很低。

最佳答案

考虑一下哈希表是如何工作的。您将哈希函数应用于该项目,并根据该哈希值将该项目分配给一个槽。但可能会出现两个不同的项具有相同的哈希值。在这种情况下,哈希表将创建具有相同哈希值的值列表。这称为碰撞。

在哈希表实现中,我们尝试避免冲突。但在这里它会很好地为你服务。如果您可以找到一个哈希函数,使得:同一组中的两个数字具有相同的哈希值,您就可以轻松地将这些数字分组。

此类哈希函数的示例如下:

  • 将数字转换为字符串
  • 按升序对字符串进行排序

同一组中的所有数字将具有相同的哈希值。

实现示例:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <unordered_map>
#include <vector>

using namespace std;


unordered_map<string, vector<int>> group_numbers(vector<int> numbers) {
    unordered_map<string, vector<int>> results;
    for(auto n : numbers) {
        stringstream buffer;
        buffer << n;
        string hash;
        buffer >> hash;

        sort(begin(hash), end(hash));
        results[hash].push_back(n);
    }
    return results;
}


int main() {
    vector<int> numbers{1, 10, 3, 33, 133, 331, 313, 333};
    auto results = group_numbers(numbers);
    int group = 0;
    for(auto kv : results) {
        cout << "Group " << (++group) << " : ";
        copy(begin(kv.second), end(kv.second),
             ostream_iterator<int>(cout, " "));
        cout << "\n";
    }
}

然后运行时打印:

Group 1 : 333
Group 2 : 133 331 313
Group 3 : 1
Group 4 : 10
Group 5 : 33
Group 6 : 3

关于c++ - 获取给定数字集中具有相同数字频率的组数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36800585/

相关文章:

python - 如何在 Python 中求 1000 以下的所有 3 或 5 的倍数之和?

java - 关于在 GWT、GXT、SmartGwt 等中减少代码长度、JS 大小(加载时间)的想法

c++ - __STDC_VERSION__ 未在 C++11 中定义?

c++ - 使用模板类时出现内部编译错误

algorithm - 搜索最近的 k 个元素

algorithm - 在恒定时间内运行的分而治之算法?

c - 在c中递归查找数组的第三大元素

c++ - 如何使用非指针属性的析构函数

c++ - 将监视器显示上的大数字与 MONITORINFOEX 中的 szDevice 进行匹配

c++ - Boost 库 iostream::copy 不起作用