gpt4 book ai didi

c++ - 在 C++ 中计算重复项

转载 作者:太空狗 更新时间:2023-10-29 20:10:28 25 4
gpt4 key购买 nike

假设我有一个整数数组 {100, 80, 90, 100, 80, 60}

所以我想计算这些重复项并保存这些计数器以备后用。因为每个重复的数字都应该除以计数器

就像 100 被重复了 2 次,所以它们应该每次都是 50。

为了查找重复项,我使用了排序。

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

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

最佳答案

方法一

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

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

然后您可以处理 map 的内容:

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

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

方法二

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

...
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;
}
}

如果需要存储对以在第二步中处理它们,则需要存储对(最好存储在 vector 中,但如果需要则存储在数组中):

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

关于c++ - 在 C++ 中计算重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39676779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com