计算数组中元素重复的次数

时间:2016-01-15 21:37:22

标签: c++

我试图编写的程序允许我输入10个数字,它应该告诉我数字X重复X次,依此类推。

我一直在尝试这个,但问题是我得到的结果如下:

例如...... {1,1,1,1,4,6,4,7,4}

  

数字1重复4次

     

数字1重复3次

     

数字1重复2次

     

数字1重复1次

     

数字4重复3次

     

数字6重复1次

     

数字4重复2次

     

数字7重复1次

     

数字4重复1次

问题在于它使用以下数字检查下一个数字而不跳过它,或者不知道它已经写过

#include <iostream>
#include <string>
using namespace std;
int main() {
    int x[10];
    for (int i=0;i<10;i++) {
        cin>>x[i];
    }

    for (int i=0;i<9;i++) {
        int count=1;
        for (int j=i+1;j<10;j++) { 
            if (x[i]==x[j]) count++;
        }
        cout<<"The number "<<x[i]<<" is repeated "<<count<<" times"<<"\n";
    }
}

10 个答案:

答案 0 :(得分:3)

您的代码存在的问题是您重新处理已经处理过的数字。因此,如果位置0处出现1而位置5出现1,那么当您进入循环时,您将再次处理位置5处的1

因此,您需要一种方法来决定是否已经处理过某个号码。一种简单的方法是添加第二个数组(最初所有值都设置为0),每当处理数字时,您都标记该元素出现的所有位置。现在在处理元素之前,检查它是否已被处理,如果是这种情况则不执行任何操作。

另外,请尝试正确缩进代码:)

C ++代码:

int main( void ) {
    const int N = 10;

    int A[N];
    for(int i = 0; i < N; i++)
        cin >> A[i];

    int seen[N];
    for(int i = 0; i < N; i++)
        seen[i] = 0;

    for(int i = 0; i < N; i++) {
        if(seen[i] == 0) {
            int count = 0;
            for(int j = i; j < N; j++)
                if(A[j] == A[i]) {
                    count += 1;
                    seen[j] = 1;
                }
            cout << A[i] << " occurs " << count << " times" << endl;
        }
    }

    return 0;
}

答案 1 :(得分:2)

这是使用std::map的一个相当简单的实现。

#include <map>
#include <vector>
#include <cstdlib>
#include <iostream>

std::map<int, unsigned int> counter(const std::vector<int>& vals) {
    std::map<int, unsigned int> rv;

    for (auto val = vals.begin(); val != vals.end(); ++val) {
        rv[*val]++;
    }

    return rv;
}

void display(const std::map<int, unsigned int>& counts) {
    for (auto count = counts.begin(); count != counts.end(); ++count) {
        std::cout << "Value " << count->first << " has count "
                  << count->second << std::endl;
    }
}

int main(int argc, char** argv) {
    std::vector<int> mem = {1, 1, 1, 1, 4, 6, 4, 7, 4};
    display(counter(mem));

    return 0;
}

输出:

Value 1 has count 4
Value 4 has count 3
Value 6 has count 1
Value 7 has count 1

使用C ++ 14标准编译,但它也适用于C ++ 11。摆脱向量初始化器并使用auto,它应该适用于C ++ 98。

答案 2 :(得分:0)

我最近遇到的最有效的方式......

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
int array[10]={1,1,1,1,4,6,4,7,4};
int a[100];
memset(a,0,sizeof(a));
for(int i=0; i<sizeof(array)/sizeof(array[0]); i++)
{
    a[array[i]]++;
}
for(int i=1; i<sizeof(a)/sizeof(a[0]); i++)
{
    if(a[i]>0)
    {
        cout<<"The number "<<i<<"is repeated "<<a[i]<<" times"<<"\n";
    }

}

输出:

The number 1 is repeated 4 times
The number 4 is repeated 3 times
The number 6 is repeated 1 times
The number 7 is repeated 1 times

答案 3 :(得分:0)

如果你已经知道数组中元素的可能值是什么,那么我的解决方案是有效的。例如,从0到9,从5到8,依此类推。我使用嵌套for循环来完成此任务。

Input 1 1 2 3 3 3 3

fstream fr("galbut.txt");

const int a = 7;
int M[a], P[a];

for(int x = 0; x< 7; x++)
{
    fr >> M[x];
}

for (int x = 0; x < 3; x++) // x <3 because there are only 3 possible numbers (1,2,3)
{
    P[x] = 0; // Set all elements in seperate array, on to which we will be writing the answers to be = 0.
    for( int j = 0; j < 7; j++) // At the start, this loop basically checks whether each number is equal to 1/
    {
        if(M[j] == x +1) {P[x]++;}  // If so, it adds +1 to the second array, starting from the 0th position.
        //Then the loop checks whether each number is equal to 2 and if so, adds +1 to the other array in the 1st position now.
    }

    cout << P[x] << endl;

}

输出:2 1 4

答案 4 :(得分:0)

使用map非常简单!

  

请参见Repl.it

#include <iostream>
#include <map>

int main()
{
    int foo[]{1,1,1,1,4,6,4,7,4};
    std::map<int, int> bar;

    for (auto const &f : foo)
        bar[f]++;

    for (auto const &b : bar)
        std::cout << "The number " << b.first 
                  << "is repeated " << b.second 
                  << "times\n";
}

预期输出:

The number 1 is repeated 4 times
The number 4 is repeated 3 times
The number 6 is repeated 1 times
The number 7 is repeated 1 times

答案 5 :(得分:0)

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cout<<"enter length of array:"<<endl;
    cin>>n;
    int arr[n];
    for(int i=0;i<n;i++)
    {
        cout<<"enter element:";
        cin>>arr[i];

    }
    sort(arr,arr+n);
    /*this is for sort the array so we can find maximum element form user input and 
   using this element we make one array of that size
   */
    int m=arr[n-1];
    m++;
    int a[m];


    for(int i=0;i<m;i++)
    {
        a[i]=0;
    }

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

     a[arr[i]]++;
    }
   cout<<endl;
        for(int i=0;i<m;i++)
        {
            if(a[i]>0)
                cout<<i<<"is repeat:"<<a[i]<<"time"<<endl;


        }


}

输出如下:

输入数组长度:

6

输入元素:6

输入元素:5

输入元素:5

输入元素:6

输入元素:2

输入元素:3

2次重复:1次

3次重复:1次

5次重复:2次

6次重复:2次

答案 6 :(得分:0)

package DP;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class countsofRepeatedNumber {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int arr[]= {1,1,1,1,4,4,6,4,7};
        int n=arr.length;
        countNumber(arr,n);
    }
    
    private static void countNumber(int[] arr, int n) {
        TreeMap<Integer,Integer>list= new TreeMap<Integer,Integer>();
        
         Arrays.sort(arr);
         int count=1;
         for(int i=0;i<n-1;i++) {
            
             if(arr[i]==arr[i+1]) {
                 count++;
             }else {
                 list.put(arr[i], count);
                 count=1; 
             }
             
            
         }
         list.put(arr[n-1], count);
         
         printDatas(list);
         
    }
    
    private static void printDatas(TreeMap<Integer, Integer> list) {
        for(Map.Entry<Integer, Integer>m:list.entrySet()) {
            System.out.println("Item "+m.getKey()+": "+m.getValue());
        }
    }

}

答案 7 :(得分:0)

#include 使用命名空间 std; int Duplicate(int a[],int n){ int i; int c=1; for(i=0;i1) cout<>t; while(t--){ int n; cin>>n; int a[n]; for(int i=0;i>a[i];排序(a,a+n);重复(a,n); } }

答案 8 :(得分:0)

这段代码只需要 O(n) 时间和 O(1) 空间

#include 使用命名空间 std; int Duplicate(int a[],int n){ int i; int c=1; for(i=0;i1) cout<>t; while(t--){ int n; cin>>n; int a[n]; for(int i=0;i>a[i];排序(a,a+n);重复(a,n); } }

答案 9 :(得分:0)

    #include <iostream>
    #include<map>
    using namespace std;
    int main()
    {
           int arr[]={1,1,1,1,4,6,4,7,4};
           int count=1;
           map<int,int> mymap;
           try
           {
               if(sizeof(arr)/sizeof(arr[0])<=1)
               {
                  throw 1;
               }
           }
           catch(int x)
           {
               cout<<"array size is not be 1";
               return 0;
           }
           
           for(int i=0;i<(sizeof(arr)/sizeof(arr[0]));i++)
           {
                   for(int j=i;j<(sizeof(arr)/sizeof(arr[0]));j++)
                   {
                       if(arr[i]==arr[j+1])
                       {
                           count++;
                       }
                   }
                   
                   if(mymap.find(arr[i])!=mymap.end())
                   {
                       auto it = mymap.find(arr[i]);
                       if((it)->second<=count)
                        (it)->second=count;
                       count=1;
                   }
                   else if(count)
                   {
                      mymap.insert(pair<int,int>(arr[i],count));
                      count=1;
                   }
           }
          
           for(auto it=mymap.begin();it!=mymap.end();it++)
           {
               cout<<it->first<<"->"<<it->second<<endl;
           }
        
        return 0;
    }

预期输出:

1->4                                                                                                                             
4->3                                                                                                                             
6->1                                                                                                                             
7->1