如何解决计算数组中重复元素的数量
问题是要计算给定数组中重复元素的数量:
假设输入为:
- 1
1 2 3 3 3
- 2
1 2 2 3 3 3 4 5
然后,第一个输入的输出应为3,第二个输入的输出应为5。
我已经编写了代码,根据逻辑它的输出应该是3,但是我得到的输出是5,任何人都可以发现错误。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a[5] = {
1,4,2,4
};
int b[101];
memset(b,101);
int cp = 0,i = 0;
b[a[i]] = 1;
for (int j = i + 1; j < 5; j++) {
if (b[a[j] > 0]) {
if (b[a[j]] == 1)
cp++;
cp++;
b[a[j]]++;
} else
b[a[j]] = 1;
}
cout << cp;
return 0;
}
解决方法
您的代码中有一个错字-您写的是if(b[a[j]>0])
而不是if (b[a[j]] > 0)
,这会产生完全不同的行为。
为避免此类错误,应正确设置代码格式,并为变量赋予有意义的名称。例如,您的主要功能可以改写为:
int main() {
const size_t SIZE = 5;
int a[SIZE] = {1,4,2,4};
const int MAX_VALUE = 100;
int count[1 + MAX_VALUE] = {};
int duplicates = 0;
for (int j = 0; j < SIZE; j++) {
if (count[a[j]] > 0)
duplicates++;
if (count[a[j]] == 1)
duplicates++;
count[a[j]]++;
}
cout << duplicates;
}
请注意,我还删除了第一个数组元素的特殊情况-这是不必要的,并且经常容易出错。
,如果我读到类似的内容
#include <bits/stdc++.h>
using namespace std;
和变量名,那么我认为这个问题与某个竞争性编程站点有关。因此,我的猜测是还有更多我们不知道的约束。我们在这里看到例如魔术数字101。也许有一个限制,我们只能有0..100范围内的整数。无论如何,我们不知道。
我想展示一个C ++解决方案。基本上,这是通过使用std::map
或std::unordered_map
来计数项目的标准方法。
请参阅以下代码,该代码基本上由两行组成。我将在后面解释:
#include <iostream>
#include <vector>
#include <unordered_map>
#include <numeric>
std::vector testData{ 1,4 };
int main() {
std::unordered_map<int,size_t> counter{};
// Count the occurence of each integer value
for (const int i : testData) counter[i]++;
// Accumulate repeating values and show result
std::cout << std::accumulate(counter.begin(),counter.end(),0U,[](size_t c,const auto& p) { return c+(p.second > 1 ? p.second : 0U); });
return 0;
}
如上所述,我们对地图使用标准方法。这里的重点是了解地图的索引运算符。请参阅here。并阅读:
返回对映射到与key等效的键的值的引用,如果该键尚不存在,则执行插入操作。
重要的一点是:如果已在映射中,则它将返回对值的引用。如果不是,它将在映射中创建值,然后再次返回对该值的引用。而且由于我们可以通过任何方式获得对该值的引用,因此我们可以简单地对其进行递增。
在非常简单的for循环中对“ testData”-向量中的所有源值完成此操作之后,我们便得到了所有值的计数。如果一个值的计数大于1,则它是重复的或“重复的”。
因此,我们只需要累加所有大于1的计数器。为此,我们使用专用功能std::accumulate
。
如果您有任何疑问,请询问。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。