如何计算数组中的相同元素,例如,如果我有一个5
整数数组,那么此arr[5] = { 1, 2, 3, 4, 5};
输出应该是:0
,因为没有重复元素,但如果我有arr[5] = { 1, 1, 2, 3, 5};
输出应该是:2
,因为1
重复2
次,依此类推。我已尝试使用以下代码解决此问题:
#include <iostream>
using namespace std;
int main(){
int arr[5] = { 1, 1, 2, 3, 4};
int cnt = 0;
for (int i = 0; i < 5; i++){
for (int j = i + 1; j < 5; j++){
if (arr[i] == arr[j]){
cnt++;
}
}
}
cout << cnt << endl;
return 0;
}
预期输出为2
,但此代码的当前输出为1
。
int arr[5] = { 1, 1, 2, 1, 1};
预期输出为4
,但目前的输出为6
。
这段代码有什么问题?
有时它会输出预期的,有时它不会输出。
答案 0 :(得分:1)
代码工作正常,让我说明如何:
arr[5] = { 1, 1, 2, 3, 4};
i = 0 =&gt; a [i] = 1将与j = 1(a [j] = 1)
匹配 因此,计数是1 arr[5] = { 1, 1, 2, 1, 1};
i = 0 =&gt; a [i] = 1将匹配j = 1,3,4 =&gt; count = 3
i = 1将匹配j = 3,4 =&gt; count = 5
i = 3将与j = 4 =&gt;匹配count = 6
根据您编写的代码,这是您获得的输出;这是完全正确的。错误在于你的逻辑。
这是正确的逻辑:
#include <iostream>
#include <map>
int main(){
int arr[5] = { 1, 1, 2, 1, 1};
int cnt = 0;
std::map<int, int> mp;
for (int i = 0; i < 5; i++){
mp[arr[i]]++;
}
for(auto it=mp.begin(); it!=mp.end(); ++it)
{
if(it->second==1)
continue;
else
cnt +=it->second;
}
std::cout << cnt << "\n";
return 0;
}
您可以将所有值存储在地图中,并显示频率,并在频率大于1时增加计数。
答案 1 :(得分:0)
您可以使用标准模板库(STL)的某些功能。
std::sort()
对数组进行排序,这有助于使用std::unique()
计算重复次数,因为它需要一个已排序的容器。
首先对数组进行排序,然后使用比较器计算重复次数,而std::unique()
从数组中删除重复项。代码可以存储重复的唯一元素的数量,并计算删除的元素。因此,最后,您可以将已删除元素的数量与具有重复的唯一元素的数量相加。
我的例子在这里:
#include <iostream>
#include <algorithm>
#include <map>
int main(int argc, const char * argv[])
{
const int32_t SIZE = 7;
int32_t ArrInput[SIZE]{1, 3, 4, 1, 1, 5, 4};
std::sort(ArrInput, ArrInput+SIZE);
int32_t CountRemovedRepetitions = 0;
std::map<int32_t, int32_t> MapAllUniqueRepetition;
std::unique(ArrInput, ArrInput+SIZE,
[&MapAllUniqueRepetition, &CountRemovedRepetitions](const int32_t v1, const int32_t v2) {
if (v1 == v2) {
MapAllUniqueRepetition[v1]++;
CountRemovedRepetitions++;
return true;
}
return false;
}
);
int32_t CountTotalRepetitions = MapAllUniqueRepetition.size() + CountRemovedRepetitions;
std::cout << "Count removed repetitions:" << CountRemovedRepetitions << " and count total repetiotions: " << CountTotalRepetitions << std::endl;
return 0;
}
程序结果是:
Count removed repetitions:3 and count total repetiotions: 5 Program ended with exit code: 0
此外,我必须告诉ArrInput
将删除重复的元素,并将进行排序。因此,如果您需要计算,则应将ArrInput复制到临时数组中。
答案 2 :(得分:0)
地图是非唯一值的地图唯一键。每当我们在数组中找到一个值时,你只需增加你看到它的次数(值)。
#include <map>
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> a = {1, 1, 2, 1, 1};
// Associative array that associates
// keys (values from the array) and values,
// (the number of times we find a given key)
map<int, int> m;
int n = a.size();
// Total number of duplicates, we start
// at zero, and we will add all the values
// that exceed 1 in our map.
int sum = 0;
// Iterates over map
map<string, int>::iterator it;
// Loop through array / vector
for (int i = 0; i < n; i++) {
// Add 1 to the value associated
// with the key a[i]
m[ a[i] ] += 1;
}
// Loop through the map
for (auto it=m.begin(); it!=m.end(); ++it) {
// If a given value was found
// more than once, add the number of
// times we found it to the running sum
if (it->second > 1) {
sum += it->second;
}
}
// Overall sum of duplicates found
cout << sum << "\n";
return 0;
}