Частота чисел в одномерном массиве

Прошло 6 часов с тех пор, как я писал код, но безрезультатно, я не знаю, где я делаю ошибку, но я делаю кое-что. Его программа вывода частоты и вывод должны быть такими:

array[8] = {6,1,7,8,6,6,1,9}

Выход:

6:3
1:2
7:1
8:1
9:1

Но это повторяет те же цифры в моем коде. Любая помощь будет очень заметной.

int array[8] = {6,1,7,8,6,6,1,9};
int store[8];
int a =0;
int b =0;
int c=0;

int d = 0;
store[d] = array[b];
for (d = 0; d < 8; d++){
int count=0;
c = d;
b = d;
for (int e = 0; e < d; e++){
if (array[b] == store[e]){
store[d] = array[b];
b++;
e = 0;

}
else
{
store[d] = array[b];
break;
}
}

for ( int z = 0; z < 7; z++){
if (store[d] == array[z])
{
count++;

}
}
cout << store[d] << ":" << count << endl;
}

1

Решение

Я не уверен, что вы пытаетесь сделать с массивами. Я пытался следовать логике, но это трудно увидеть со всеми анонимными именами переменных. Похоже, вы пытаетесь искать дубликаты ранее в массиве, но переменная e никогда не получает никакого другого значения, кроме 0, так что вы будете сравнивать только с первым элементом в массиве.

Вы можете просто посмотреть в самом массиве на наличие предыдущих вхождений, и как только вы узнаете, что число является первым вхождением, вам нужно только искать в нем больше вхождений:

int array[8] = {6,1,7,8,6,6,1,9};

for (int i = 0; i < 8; i++) {

// look to the left in the array if the number was used before
int found = 0;
for (int j = 0; j < i; j++) {
if (array[i] == array[j]) found++;
}

// go on if it's the first occurance
if (found == 0) {

// we know of one occurance
int count = 1;

// look to the right in the array for other occurances
for (int j = i + 1; j < 8; j++) {
if (array[i] == array[j]) count++;
}

cout << array[i] << ":" << count << endl;
}
}
1

Другие решения

Вы можете использовать карту сначала для хранения num-> частоты, а затем мультикарту для хранения freqeuncy => num.

Вот это рабочий раствор.

#include <map>
#include <algorithm>
#include <iostream>

int main()
{
int array[8] = {6,1,7,8,6,6,1,9};

// A map to store num => freq
std::map <int, int> freq;

// A map to store freq(can be duplicate) => num
std::multimap <int, int> freqCounts;

// Store num => frequency
for (int i = 0 ; i < 8; i++)
{
freq[array[i]] += 1;
}

// Now Store freq => num
for(auto const & iter : freq)
{
freqCounts.insert (std::pair<int,int>(iter.second, iter.first));
}

// Print in reverse order i.e. highest frequency first
for (std::multimap<int,int>::reverse_iterator rit=freqCounts.rbegin(); rit!=freqCounts.rend(); ++rit)
{
std::cout << rit->second << " : " << rit->first << '\n';
}
return 0;
}
4

Вы никогда не обновляете счетчики. Попробуй это:

int array[8] = {6,1,7,8,6,6,1,9};

unsigned int store[10] = {};    // large enough to hold the largest array value,
// initialized to zero

for (int n : array) ++store[n]; // update counts

for (int i = 0; i != 10; ++i)
{
std::cout << "Frequency of int " << i << " is " << store[i] << "\n";
}

Если набор значений, которые встречаются, является редким, или содержит отрицательные значения, или просто не вписывается в плотный диапазон целых чисел, вы можете заменить unsigned int[10] с ассоциативным контейнером, например:

std::map<int, unsigned int> store;

// algorithm as before

for (auto const & p : store)
{
std::cout << "Frequency of " << p.first << " is " << p.second << "\n";
}
3

Я хотел представить свое решение, которое, как мне кажется, более простое:

#include <iostream>
using namespace std;

int main() {
int n; //number of Elements in the vector
cin>>n;
int vec[n]; //vector with all elements
int v[n];  //vector with Elements without repetition
int c[n];  // vector which stores the frequency of each element
for(int i=0; i<n; i++)
cin>>vec[i];
int k=0; // number of Elements of the vector without Repetition, in the begining, it has 0 Elements
int j=0; //logic Counter, could be replaced with bool
for(int i=0; i<n; i++) {
for(int h=0; h<=k; h++) {
if(vec[i]==v[h]) {
c[h]++;
j=1;
break;
}
}
//if element i of the original vector is equal to element h of the second vector, then increment the frequency of this element
if(j==0) { //else if the element is not equal to any of the second vector, the Position of the 2nd vector is filled with the element, which in this case is the first of ist Kind.
v[k]=vec[i];
c[k]=1;
k++;
} //the number of Elements is increased by one to store another element;
else {
j=0;
}
}
cout<<endl<<endl;
for(int i=0; i<k; i++)
cout<<v[i]<<":"<<c[i]<<endl;
return 0;
}
0
#include<iostream>
#include<conio.h>
using namespace std;
main()
{   int count[10],key[10],n=10,m;
int i,j,k,temp;
cout<<"Enter The Size Of Array:-\n";
cin>>n;
int a[n];
cout<<"Enter The Elements in Array:-\n";
for(i=0; i<n; i++)
cin>>a[i];
for(i=0; i<n; i++)
for(j=0; j<n-1; j++)
{   if(a[j]>a[j+1])
{   temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
for(i=0; i<n; i++)
cout<<a[i]<<"\t";
for(i=0,k=0; i<n; k++)
{   count[k]=0;
key[k]=a[i];
for(j=i; j<n; j++)
{   if(a[i]==a[j])
count[k]++;
}
i=i+count[k];
}
for(i=0; i<k; i++)
cout<<endl<<key[i]<<" Occurred "<<count[i]<<" Times\n";
getch();
}
0
По вопросам рекламы [email protected]