如何计算c ++中相同数组元素的数量?

时间:2018-04-19 19:39:44

标签: c++ arrays

如何计算数组中的相同元素,例如,如果我有一个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

这段代码有什么问题?
有时它会输出预期的,有时它不会输出。

3 个答案:

答案 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;
}