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

C++ 计算数组中元素的重复次数,c++,C++,我试图编写的程序允许我输入10个数字,它应该会告诉我数字X重复了X次,以此类推 我一直在尝试,但问题是我得到的结果如下: 例如……{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 nam

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

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

例如……{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";
    }
}
#包括
#包括
使用名称空间std;
int main(){
int x[10];
对于(int i=0;i>x[i];
}

对于(int i=0;i代码的问题在于您重新处理了已经处理过的数字。因此,如果在位置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;
}
int main(无效){
常数int N=10;
int A[N];
对于(int i=0;i>A[i];
int-seen[N];
对于(int i=0;icout下面是一个使用
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;
}
使用C++14标准编译,但它也应该与C++11一起使用。去掉向量初始值设定项和使用
auto
,它应该与C++98一起使用

更新:

我已经更新了这个代码,使用了<代码> STD::unOrdEdEdMult/<代码>,而不是<代码> STD::MAP< /COD>,因为顺序似乎不是问题。而且,我已经简化了基于一些新的C++特性的循环控制。

#include <unordered_map>
#include <vector>
#include <cstdlib>
#include <iostream>

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

    for (auto val : vals) {
        rv[val]++;
    }

    return rv;
}

void display(const std::unordered_map<int, unsigned int>& counts) {
    for (auto count : counts) {
        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;
}

在这种情况下,计数的顺序将是随机的,因为
std::unordered_map
是一个没有内在顺序的哈希表。

我最近遇到的最有效的方法是

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

}

使用
map
非常简单

#包括
#包括
使用名称空间std;
int main()
{
int n;
cout
package-DP;
导入java.util.array;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.TreeMap;
公共类countsofRepeatedNumber{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
int arr[]={1,1,1,4,4,6,4,7};
int n=阵列长度;
countNumber(arr,n);
}
私有静态void countNumber(int[]arr,int n){
TreeMaplist=新的TreeMap();
数组。排序(arr);
整数计数=1;
对于(inti=0;i#include使用名称空间std;intduplicate(inta[],intn){inti;intc=1;对于(i=0;i1)cout,此代码仅在O(n)时间和O(1)空间中


#包括使用命名空间std;int Duplicate(int a[],int n){int i;int c=1;for(i=0;i1)coutHint:尝试使用
std::map
。另一个提示是,在程序中有两个循环:一个用于读取内容,另一个用于报告计数。已经有两个循环!!!for(int i=0;iMerci beucup mon ami Wow这是一个很好的例子。为什么你要发布两次相同的内容?你可以在任何时候发布你的答案。社区鼓励在SDE代码中添加解释,而不是纯粹基于代码的答案(请参阅)。此外,请查看以改进格式。为什么要发布两次相同的内容?您可以随时更改答案。社区鼓励添加代码解释,而不是纯粹基于代码的答案(请参阅)。此外,请查看以改进格式。
Value 7 has count 1
Value 6 has count 1
Value 4 has count 3
Value 1 has count 4
#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
#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
#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;


        }


}
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());
        }
    }

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