C语言找出一个数组中出现次数最多的那个元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言找出一个数组中出现次数最多的那个元素相关的知识,希望对你有一定的参考价值。
第一行输入一个整数n(不大于20)第二行输入n个整数,找出n个整数中出现次数最多的那个整数
#include<stdio.h>
int main()
int n,i,j,k,t,m,a[25];
while(scanf("%d",&n)!=EOF)
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j])
t=a[i];
a[i]=a[j];
a[j]=t;//先进行排序,按从小到大的顺序依次排列,排列须引入中间量t。
t=a[0];
m=1;
k=1; //t记录当前出现次数最多的数,m记录t出现的次数,k记录当前数出现的次数,
for(i=1;i<n;i++)
if(a[i]!=a[i-1])//如果前后两数不相等了
if(k>m)//只出现一遍则不会有k>m,由于m不断更新,值会变大,所以不一定会有k>m反复
m=k;//如果k>m了,m变大,保证m是出现次数最多的数的次数
t=a[i-1];//m由k赋值,k代表的是a【i-1】
k=1;//新的数字k重新变为1,再循环,不然k会一直变大,使得m也改变
else
k++;//前后两数相等,k即次数增加
if(k>m)//循环最后进行更新,不然如果最后一项次数最多,无法输出最后一项
m=k;
t=a[i-1];
printf("%d\\n",t);
return 0;
扩展资料:
数组使用规则:
1.可以只给部分元素赋初值。当 中值的个数少于元素个数时,只给前面部分元素赋值。例如:static int a[10]=0,1,2,3,4;表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。
2.只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:static int a[10]=1,1,1,1,1,1,1,1,1,1;而不能写为:static int a[10]=1。
3.如不给可初始化的数组赋初值,则全部元素均为0值。
4.如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。例如:static int a[5]=1,2,3,4,5;可写为:static int a[]=1,2,3,4,5;动态赋值可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。
参考资料:
百度百科-数组
参考技术A#include "stdio.h"
int main()
int n,a[20],i,j,flag=0,max;
int b[20]=0;//计数数组
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]==a[j])
b[i]++;
for(i=0;i<n;i++)
if(b[i]!=0)
flag=1;
break;
if(flag==0)
printf("输入数据中没有重复出现的数!\\n");
return 1;
max=b[0];
for(i=1;i<n;i++)
if(b[i]>max)
max=b[i];
for(i=0;i<n;i++)
if(max==b[i])
printf("出现最多次数的是%d,一共出现%d次\\n",a[i],b[i]+1);
1,快速排序等等的可以在O(nlgn)完成的排序策略
2,对排序好的数据,以O(n)的方式遍历,例如 1 2 2 2 3 3 3 3 3 5 8 8 9 9 9 9
可以得到1, 1 2, 3 3,5 5, 1 8, 2 9, 4 这可以用一个struct结构体存储,左边的是数值,右边的是此数值的个数
3,对结构体数组寻找右边的个数的最大值,可以看到3,5中的5是最大的,即可求出为1
如果限制了n个整数的每一个整数的范围,例如所输入的整数为0-255之间,那么这样就可以以O(n)的级别完成。
1,做一个256的数组,count[256],初始为0
2,遍历输入的数据,例如当前输入为8 ,那么执行 count[8]++;
3,遍历count数组,找到最大的count[i],那么i的值就是那个整数的值。
代码我就不贴了,毕竟我还有很多事情要做,而且编程是需要训练的,有了思路,实现就是一个时间和体力的问题了。
哎,比较失望。费了那么大的劲提供了O(n)和O(nlgn)的思路,还是被否决了,无语了都。你想用O(n^2)级别完成,或者想要直接的代码,我就不用费那么大的劲来阐述思想了。编程学的是思想,要的是体力劳动,不是copy。
last version 2013-05-28 15:28
this time update at 2015-05-08 13:44
今天上网看到这个回答有了44个赞同,还是略有些开心的。当年回答这个问题的时候还是在大学,年轻气盛,说了一些不该说的话,现在想来完全没有那个必要了。针对这个问题,现在看来又有一些其他的看法,希望能跟大家分享一下:
法1: 利用二叉排序树的思想,主要基于其O(logn)的查找效率。 从第1到第n个元素逐个遍历,并将元素插入到一个初始为空的二叉排序树中。在插入的过程中会有查找操作,如果此元素已经存在,则对其的count的属性增1, 如果不存在,就将其插入到二叉树中。插入的时间复杂度应该是O(lgn)级别,n个元素,应该是nlgn级别,其实可以在插入的时候始终记录最大count的那个值,插入完毕也就找到那个值了。
法2: 利用hash散列表的思想,注意散列函数不宜复杂,否则散列就得不偿失了。 将n个元素散列到一个hash表中,可以采用类似于链式hash的策略。在散列的过程中,对于具有相同的值的元素,只记录它的一个值和count,同时一直保持这最大count的值,这样当散列完毕,最大count对应的值也就得到了。 参考技术C import java.util.HashSet;
import java.util.Set;
import java.util.List;
import java.util.ArrayList;
public class TestJ
public static void main(String[] args)
/*List<Object> list = new ArrayList<Object>();
list.add(....);
list.add(....); .....
Object[] obj1 = list.toArray();*/
//以上注释部分代码意思是:可以自己给list中加入元素,然后赋给数组obj1
Object[] obj1 = 1,1,2,2,2,3,3,3,4,4,4;
//这里用你给的这个数组简单测试一下。
//Object数组中存放对象,
Set<Object> s = new HashSet<Object>();//HashSet用来去掉重复
for(Object o:obj1)
s.add(o);
//现在的集合s中无重复的包含obj1中的所有元素
Object[] obj2 = s.toArray();//把集合s中的元素存入数组obj2中
int[] n = new int[obj2.length];//这个数组用来存放每一个元素出现的次数
int max = 0;
for(int i=0;i<obj2.length;i++)
int cout = 0;
for(int j=0;j<obj1.length;j++)
if(obj2[i].equals(obj1[j]))cout++;
//用obj2中的元素跟obj1中的每一个比较,如果相同cout自增
n[i] = cout;//每一个元素出现的次数存入数组n
//数组n的下标i跟数组obj2的下标是一一对应的。
if(max<cout)//得到元素出现次数最多是多少次
max = cout;
for(int i=0;i<n.length;i++)
if(max==n[i])
/ /如果出现的次数等于最大次数,就输出对应数组obj2中的元素
System.out.println(obj2[i]);
参考技术D
XJOI的题,题号3565,本人比较笨,所以代码写的也比较复杂可能没人看得懂,我是按一种感觉特殊的方式写的,好了废话不多说看代码。
#include <bits/stdc++.h>using namespace std;
int main()
int n,max=0;
cin>>n;
int a[n+1];
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
if(a[i]>max)
max=a[i];
int book[max+1],max2=0;
for(int i=1;i<=max;i++)
book[i]=0;
for(int i=1;i<=n;i++)
book[a[i]]++;
for(int i=1;i<=max;i++)
if(book[i]>max2)
max2=book[i];
for(int i=1;i<=max;i++)
if(max2==book[i])
printf("%d",i);
break;
return 0;
方法二:更加简单后面想出来的!
#include<bits/stdc++.h>
using namespace std;
int a[100];
int b[100];
int main()
memset(a,0,sizeof(0));
int n;
cin>>n;
memset(a,0,sizeof(a));
int ans=0;
int tamp;
for(int i=0;i<n;i++)
cin>>tamp;
a[tamp]++;
if(a[tamp]>a[ans])
ans=tamp;
cout<<ans;
return 0;
在c#中找出一个数组中出现次数最多的元素,求各种方法,要详细的代码
方法1:数组循环,每次拿一个元素a和余下的数组元素比较,遇到重复元素,计数器加1,依次计算,可算出拿出元素a的出现次数接下来拿另外一个元素b和余下的数组元素比较,遇到重复元素,计数器加1,当计算完后,拿新计数器结果和原计数器结果比较
如果计数器小,则不赋值,否则用新计数器替代旧计数器结果,其他的以此类推完成,可最终获得出现计数器最大的结果,就是你想要的
方法2:使用字典结果来存储,循环数组,每次往字典里面添加KEY,遇到重复的KEY就修改KEY对应的字典值(KEY出现的次数)最终页可以获得结果
方法3:使用Lambda表达式,毕竟你使用的数组结构,肯定可以用到的,具体我没去想了追问
我是新手,你说的第一种方法能不能给段代码呢,这是我写的随机生成10000个五位数数字,怎样找出出现最多的那个元素及出现次数,
int[] n = new int[10000];
System.Random rnd = new System.Random();
for (int ctr = 0; ctr < 10000; ctr++)
n[ctr] = (int)rnd.Next(10000, 99999);
如果可以,你晚上再给我发个信息,我现在在公司,不方便写,你可以加我扣_扣(21208765),我写给你看下
参考技术A int[] nums = new int[] 1, 1, 3, 1, 3,4,4,4 ;//分组 计算每个元素跟它出现的次数
var d = from n in nums group n by n into g select new Key = g.Key, Count = g.Count() ;
//找到出现次数最多的那个次数
var max = d.Max(a => a.Count);
//根据最对的次数 查找元素
var maxItems = from m in d where m.Count == max select m.Key;
可能有多个元素出现同样多的次数,所以最后的结果是一个列表
该例的结果是 1,4 都出现3次 是最多的 参考技术B
http://zhidao.baidu.com/question/539842343?&oldq=1#answer-1363408863
这个是 得出一个数组中每个元素出现的次数,你只要比较 结果那个是最大的即可
#region 输出结果string result = "结果:<br/>";
int counts = 0;
string maxValue="";
foreach (System.Collections.DictionaryEntry de in ht)
if (Convert.ToInt32(de.Value) > counts)
counts = Convert.ToInt32(de.Value);
maxValue=de.Key.ToString();
result += de.Key.ToString() + "有" + de.Value.ToString() + "个相同<br/>";
#endregion
Response.Write(result+"出现最多次的是:"+maxValue+"出现次数"+(counts+1).ToString()); 参考技术C 用linq吧,linq 应该比较简单点
以上是关于C语言找出一个数组中出现次数最多的那个元素的主要内容,如果未能解决你的问题,请参考以下文章
数组中有一个数字出现次数超过数组长度一半,找出这个数字(用C语言解决)。要求时间复杂度尽量小。