2017-05-26 2 views
-3

Ich möchte ein Programm machen, wie viele Zahlen zählen hatCount Wiederholungszahl in einem Array in C++

arr1 zum Beispiel wiederholt [] = {1,2,3,4,5,1,2 } Der Ausgang sollte 2 sein, weil Nummer 1 und 2 ein Duplikat

arr2 [] = {1,1,1,2,2,3,3,3} der Ausgang sollte 3 sein, weil Nummer 1,2 und 3 hat eine doppelte

ich kann nicht eine bestimmte Antwort auf meine Frage sehen, da die Antwort immer kommt mit Zählung, wie oft die Zahl hat in einer Reihe wiederholt

sowieso her mein eigener Code

#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; 
}  
+0

ist das sortieren und dann akzeptieren Überprüfung fähig? –

+1

(Sie können auch eine Hashtabelle verwenden) –

+0

Willkommen bei Stack Overflow. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

Antwort

1

Sie können einen std :: map verwenden und überprüfen, ob der Schlüssel schon drin ist. Dann erhöhen Sie den Wert jedes Mal, wenn Sie etwas in diesen Index schieben möchten.

+0

würde ich auch benutzen std :: map dafür. Es ist schneller als das Sortieren des Arrays und weniger Aufwand für die Programmierung – Thomas

0

Ich würde eine Hash-Tabelle verwenden (std :: map) weichen speichert, wenn ein Charakter schon da ist:

#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; 
} 
0

Wie bereits an anderer Stelle aus, std::map die naheliegendste Lösung ist, aber es kann mehr getan werden prägnanter als in sebi Antwort

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

druckt

2 
3