找出向量中相同整数的个数

finding the number of same integers in vector

我有一个整数向量。我想在向量中计算相同的整数。我需要一个简单的算法。但是没有使用太多 headers 或内置函数,只是通过一个简单的算法。 非常感谢 示例:

std::v={1,1,1,2,2,3} 1:3----2:2----3:1

Sort 他们,然后计算后面数字的每一个变化。

可选:将计数保存到输出数组。

排序后尝试:

int count = 1;
for(int i = 1; i < v.size(); i++)
{
    if(v[i-1] == v[i])
    {
        count++;
    }
    else
    {
        std::cout << v[i-1] << count << std::endl;
        count = 0;
    }
}
std::cout << v[v.size()-1] << count << std::endl;

另一个解决方案是创建从 int 到 int 的附加字典。并将数字(作为键)从向量插入到字典中。如果数字存在,那么你应该增加相应给定键的值。

注意。这个字典(地图)保留了你 vector

中整数出现的次数

方法的缺点(从您的角度来看)- 您应该包括地图 header。

这种算法的总体复杂度为 O( N log N)。也许这样的算法会比使用排序更快。您不会使用一根额外的导线。你有一个结构,其中包含有关数字出现的信息

至少有两种方法,最常见的解决方案 运行s 在 O( n log n ) 时间内需要您对数组进行排序,然后遍历它以计算最长的 运行,如@yd1所述。

另一种方法是使用散列table 生成频率table。这 运行s 在 O(n) 时间内(假设 O(1) hashtable 插入和查找)但由于设置 hash[=25= 的开销,对于小输入向量长度不是最优的] 并需要重新分配散列table(以及冲突等)。

你不需要#include <unordered_map>来使用散列table:自己实现一个是本科生的练习:)但是你必须做很多跑腿工作才能获得最低限度的必要功能。

但是,如果您可以保证向量中值的范围在某个 suitable 范围内(例如 0 <= i < 256),那么您可以使用数组作为映射:

vector<int> values = ...

int table[256] = {0};
for( auto i = values.begin(); i != values.end(); ++i ) {

    assert( 0 <= i && i < 256 );

    table[*i]++;
}

然后遍历 table 以获得相同的值:

for( size_t i = 0; i < 256; ++i ) {

    if( table[i] > 1 ) cout << i << " appeared " << table[i] << " times." << endl;
}