user-0 提问: 怎么样求出数组中元素出现最大次数最多的有多少个？

回复:
user: user-1
content: 想着用链表试了一下，代码不完整， 后面释放内存没写 struct rec_data{     int num;     int occur;     rec_data *next; };  int add(rec_data *head,rec_data **tail,int n) {     rec_data *p =head->next;     for(;p;p=p->next) if(p->num==n) break;     if(!p) {         p =(rec_data *)malloc(sizeof(*p));         p->num  =n;         p->occur =0;         p->next =NULL;         (*tail)->next =p;         *tail =p;     }     return ++p->occur; }  int getcnt(int *ar,int len) {     rec_data *head = (rec_data *)malloc(sizeof(*head));     rec_data *tail =head;     head->next =NULL;     int mo=0;     for(int i=0;i<len;i++)     {         int o =add(head,&tail,ar[i]);         if(o>mo) mo=o;     }      rec_data *p =head->next;     int cnt=0;     for(;p;p=p->next)         if(p->occur==mo) ++cnt;     // release list     return cnt; }

user: user-2
content: 如果数字是10以内的，那么用下面的方法还是比较好的，如果数字比较大，那么可以先排序，再计算，这个就得自己动手了……#include <stdio.h>  int countmax(int arry[], int num) { 	int arrycount[10] = {0}; 	 	int i = 0,  maxnum, result; 	for (; i < num; i++) 		arrycount[arry[i]]++;		  	maxnum = arrycount[0]; 	result = 1; 	 	for (i = 1; i < 10; i++) 	{ 		if (arrycount[i] > maxnum) 			maxnum = arrycount[i]; 		else if (arrycount[i] == maxnum && maxnum != 0) 			++result; 	} 	return result;			 }  int main(void) { 	int arry1[] ={1, 0, 1, 2, 1, 3}; 	int arry2[] = {7, 0, 2, 0, 4, 4}; 	int arry3[] ={1,2,3,4,5,6}; 	int result1, result2, result3; 	result1 = countmax(arry1, sizeof(arry1)/ sizeof(arry1[0])); 	result2 = countmax(arry2, sizeof(arry2)/ sizeof(arry2[0]));	 	result3 = countmax(arry3, sizeof(arry3) / sizeof(arry3[0])); 	printf("the arry1 maxnum: %d\nthe arry2 maxnum: %d\nthe arry2 maxnum: %d\n", result1, result2,result3);	 }

user: user-3
content: 写的比较丑，但基本实现功能。  int findMaxOccur(int* array,int len) 	{ 		if(array==NULL||len<1) return -1; 		map<int,unsigned int> map_temp; //key is array[i],value is the times of array[i] appears 		for(int i=0;i<len;++i) 		{ 			if(map_temp.end()==map_temp.find(array[i])) //map内没有，插入 				map_temp.insert(pair<int,unsigned int>(array[i],1)); 			 				else //map内存在，则相应的value+1 					map_temp.at(array[i])++; 					 		} 		map<int,unsigned int>::iterator map_iter=map_temp.begin(); 		int temp_max = map_iter++->second; 		int result = 1; 		for(;map_iter!=map_temp.end();map_iter++) 		{ 			if(map_iter->second==temp_max) 				result++; 			else if(map_iter->second>temp_max) 			{ 				result = 1; 				temp_max = map_iter->second; 			} 		} 		return result; 	}

user: user-0
content: 引用 5 楼 user-5 的回复:假如数组的6个元素各不相同，那么你要的结果就是6，对吧，因为出现最多的次数都是1，所以一共有6个（也就是说1次也是要考虑的）。那就再循环一次咯，在free之前加入 	int k = 0; 	for (int i = 0; i != nNum; ++i) 	{ 		if (nTmp == p[i]) 		{ 			k++; 		} 	} 注意最后返回这个 k    谢谢了，看起来符合了要求了。

user: user-4
content: 遍历数组，用一个N行2列的数组保存 第一列，出现的数字 第二列，对应数字出现的次数

user: user-5
content: 假如数组的6个元素各不相同，那么你要的结果就是6，对吧，因为出现最多的次数都是1，所以一共有6个（也就是说1次也是要考虑的）。那就再循环一次咯，在free之前加入 	int k = 0; 	for (int i = 0; i != nNum; ++i) 	{ 		if (nTmp == p[i]) 		{ 			k++; 		} 	} 注意最后返回这个 k

user: user-0
content: 引用 2 楼 user-5 的回复:[quote=引用 1 楼 user-5 的回复:] 方法比较笨，仅供参考 unsigned int FindNum( int *n ,int nNum ) { 	unsigned int *p = (unsigned int *)malloc(sizeof(int)*nNum); 	memset(p ,0 ,sizeof(int)*nNum); 	for (int i = 0; i != nNum ;++i) 	{ 		p[i] = 1; 		for (int j = 0; j != i; ++j) 		{ 			if (n[i] == n[j]) 			{ 				p[j]++; 			} 		} 	} 	unsigned int nTmp = p[0]; 	for (int i = 0; i != nNum; ++i) 	{ 		if (p[i] > nTmp) 		{ 			nTmp = p[i]; 		} 	} 	free(p); 	return nTmp; }  int main() { 	int array1[]={1,0,1,2,5,3}; 	int n = FindIndex(array1,6); 	printf("最多出现了%d次\n" ,n); 	return 0; }31行调用名写错了，应该是FindNum[/quote]    我的题意不是找出一组数组中元素最大出现次数由多少。。。。而已找出最大出现次数的元素有多少个....不知道这样能表达清楚我的意思没= =

user: user-0
content: 引用 楼主 qq_23017575 的回复:可能题目说的不是很明白。。。 比如说有数组array1[]={1,0,1,2,1,3}和数组array2[]={7,0,2,0,4,4}. 其中,数组一中数字1出现次数为3且次数最大，则该数组中只有一个次数最大的元素，即ans=1。 在数组二中，数字0和数字4都是出现次数为2，一样都是最大次数，那么该数组出现的最大次数元素有两个，即ans=2。 大概就是这个意思，求怎么去实现这个问题？   我的题意不是找出一组数组中元素最大出现次数由多少。。。。而已找出最大出现次数的元素有多少个....不知道这样能表达清楚我的意思没= =

user: user-5
content: 引用 1 楼 user-5 的回复:方法比较笨，仅供参考 unsigned int FindNum( int *n ,int nNum ) { 	unsigned int *p = (unsigned int *)malloc(sizeof(int)*nNum); 	memset(p ,0 ,sizeof(int)*nNum); 	for (int i = 0; i != nNum ;++i) 	{ 		p[i] = 1; 		for (int j = 0; j != i; ++j) 		{ 			if (n[i] == n[j]) 			{ 				p[j]++; 			} 		} 	} 	unsigned int nTmp = p[0]; 	for (int i = 0; i != nNum; ++i) 	{ 		if (p[i] > nTmp) 		{ 			nTmp = p[i]; 		} 	} 	free(p); 	return nTmp; }  int main() { 	int array1[]={1,0,1,2,5,3}; 	int n = FindIndex(array1,6); 	printf("最多出现了%d次\n" ,n); 	return 0; }31行调用名写错了，应该是FindNum

user: user-5
content: 方法比较笨，仅供参考 unsigned int FindNum( int *n ,int nNum ) { 	unsigned int *p = (unsigned int *)malloc(sizeof(int)*nNum); 	memset(p ,0 ,sizeof(int)*nNum); 	for (int i = 0; i != nNum ;++i) 	{ 		p[i] = 1; 		for (int j = 0; j != i; ++j) 		{ 			if (n[i] == n[j]) 			{ 				p[j]++; 			} 		} 	} 	unsigned int nTmp = p[0]; 	for (int i = 0; i != nNum; ++i) 	{ 		if (p[i] > nTmp) 		{ 			nTmp = p[i]; 		} 	} 	free(p); 	return nTmp; }  int main() { 	int array1[]={1,0,1,2,5,3}; 	int n = FindIndex(array1,6); 	printf("最多出现了%d次\n" ,n); 	return 0; }