在C ++中计算数组中的重复数

时间:2017-05-26 10:26:34

标签: c++ arrays

我想制作一个程序来计算重复的数字,例如

arr1 [] = {1,2,3,4,5,1,2}输出应为2,因为数字1和2有重复

arr2 [] = {1,1,1,2,2,3,3,3}输出应为3,因为数字1,2和3有重复

我无法看到我问题的具体答案,因为总是出现的答案是计算数字在数组中重复的次数

无论如何都是我自己的代码

#include <iostream>

using namespace std;
int main ()
{
    int arr[64],n,clamp=0,ctr=0,maxv = 0;
    cout<<"Enter desired number of element"<<endl;
    cin>>n;
    cout<<"Enter "<<n<<" numbers"<<endl;
    for(int x=0;x<n;x++)
    {
         cin>>arr[x];
    }
    for(int i=0;i<n;i++)
    {
        if(arr[i]>maxv)
        maxv=arr[i];
    }
    for(int y=0;y<=maxv;y++)
    {
        for(int x=0;x<n;x++)
        {
            if(y==arr[x])
            {
                ctr++;
            }
            if(ctr>=2)
            {
                clamp++;
                ctr=0;
                break;
            }
        }
        ctr=0;
    }
    cout<<"The amount of repeated elements is "<<clamp<<endl;
    return 0;
}    

3 个答案:

答案 0 :(得分:1)

您可能希望使用std :: map并检查该键是否已存在。 然后,每次要将某些内容推送到此索引中时,只需增加该值。

答案 1 :(得分:0)

如果角色已经存在,我会使用哈希表(std :: map)存储:

#include<map>

int GetRepeatingCharacterNumber(int* pArray, int nCount)
{
    std::map<int, int> exists;
    int result = 0;
    for (int i = 0; i < nCount; ++i)
    {
        if (exists.find(pArray[i]) == exists.end())
        {
            //not found
            //add to map
            exists[pArray[i]] = 1;          
        }
        else
        {
            //already in there
            //check if it already counted
            if (exists[pArray[i]] == 1)
            {
                //second time found
                result++;
            }
            exists[pArray[i]] += 1;
        }
    }
    return result;
}

答案 2 :(得分:0)

正如其他地方所指出的,std::map是最明显的解决方案,但它可以比sebi的答案更简洁地完成

template<typename Iterator,
         typename Compare = std::less<typename std::iterator_traits<Iterator>::value_type> >
size_t max_number_of_repetitions(Iterator begin, const Iterator end)
{
  using key = typename std::iterator_traits<Iterator>::value_type;
  std::map<key, size_t, Compare> rep;
  size_t max_rep = 0;
  for(; begin!=end; ++begin)
    max_rep = std::max(max_rep, ++(rep[*begin]));
  return max_rep;
}

int main()
{
  int arr1 [] = {1,2,3,4,5,1,2};
  int arr2 [] = {1,1,1,2,2,3,3,3};
  std::cout<<max_number_of_repetitions(std::begin(arr1),std::end(arr1))<<'\n'
           <<max_number_of_repetitions(std::begin(arr2),std::end(arr2))<<'\n';
}

打印

2
3