在c ++中计算重复数

时间:2016-09-24 13:20:15

标签: c++ duplicates

让我说我有一系列的整数{100,80,90,100,80,60}

所以我想计算那些重复项并保存这些计数器以供日后使用。 因为每个重复的数字应该用计数器

来划分

像100重复2次,所以每次应该是50次。

找到重复项,我用了sort。

std::sort(array, array + number);
for(int i = 0; i < number; i++) {
  if(array[i] == array[i+1])
    counter++;
}

并且我试图制作计数器数组以将它们保存在每个数组上。但它没有用。请给我一些更好的主意。

4 个答案:

答案 0 :(得分:6)

方法1

最简单的方法,不是对数组进行排序,而是增加地图的元素:

unordered_map<int, size_t> count;  // holds count of each encountered number 
for (int i=0; i<number; i++)        
    count[array[i]]++;             // magic ! 

然后,您可以处理地图的内容:

for (auto &e:count)                // display the result 
    cout << e.first <<" : "<<e.second<< "-> "<<e.first/e.second<<endl; 

如果需要,可以通过从地图中重新删除它们或在处理过程中忽略它来过滤掉非重复项。

方法2

如果您不允许使用地图,那么您必须详细说明您的计数循环,以便为每个新数字重新开始计数,并且如果超过两个,还能够处理连续的重复:

...
for(int i = 0; i < number; i+=counter) {
    for (counter=1; i+counter<number && array[i+counter]==array[i]; ) 
        counter++;       // count consecutives dups
    if (counter>1) {     // if more than one, process the dups.  
        cout << "dup: " << array[i] << " "<<counter<<endl;   
    }
}

如果你需要存储对来在第二步中处理它们,你需要存储一对(最好是在一个向量中,但如果需要在数组中):

pair<int, size_t> result[number];  // a vector would be preferable
int nres=0; 
... 
    if (counter>1) {     // if more than one, process the dups.  
        // cout << "dup: " << array[i] << " "<<counter<<endl; 
        result[nres++] = make_pair(array[i], counter);  
    }
...

Online demo for both approaches

答案 1 :(得分:1)

使用std::map<int,int>std::unordered_map来计算出现次数。

然后迭代地图并用键除以原始值(计数器)替换每个值。

最后浏览原始数组并用映射值替换每个数字。

如果使用std::unordered_map,则算法为O(n)。您原来的是O(n log n),因为涉及排序。

答案 2 :(得分:0)

如果您想直接更改数组编号,可以按以下步骤操作:

for (int i = 0, counter = 1; i < number; i++) {
    if (array[i] == array[i + 1])
        counter++;
    else { //when finished counting duplicates
        for (int j = counter; j > 0; j--) //adjustment for subscripts
            array[i - j + 1] /= counter; //change the values stored in array
        counter = 1;//reinitialize array to 1
    }
}

存储在数组中的已排序值将由相应的计数器分割出来一次。

答案 3 :(得分:0)

如果允许修改序列,可以使用以下替换元素:

const auto begin = std::begin( data );
const auto end = std::end( data );
std::sort( begin, end );
for( auto it = begin; it != end; ) {
    auto next = std::upper_bound( std::next( it ), end, *it );
    auto newval = *it / std::distance( it, next );
    std::fill( it, next, newval );
    it = next;
}
<{3}}

上的

演示 修改了PS,使其也可以使用数组进行编译。