这道题的来源是一年的统考考研数据结构题,我还找了半天,没找到是哪一年的。然后这个的话,我看了一下答案感觉他那个思路不是很好理解,然后我就看到了这个思路,发现思路得很好,值的积累。
??这里的话就是重新创建了一个新的数组b,将其置为0,扫描一遍原数组a,如果比如原数组为{3,3,2,2,4,4,6,4,4},当扫描第一个的时候,在b数组第三个位置的下标加一,也就是b[3] = 1;以此类推,到最后b[2] = 2 b[3] = 2 b[4] = 4 b[6] = 1 ,此时扫描一下b数组,找出值最大的,即为愿数组中出现次数最多的元素。
下面的算法实现了找到最多的元素,然后,判断是否次数大于数组总元素的一半,如果大于就找到了,不大于,就没找到
#include<stdio.h>
#define MAX 10
#define true 1
#define false 0
//怎样过滤掉数组中的0
//找一个数组中出现次数最多的元素,并判断是否大于总元素一半多
void find_more(int a[],int n)
{
int point,times = 0,max;
int b[MAX] = {0};
for(int i = 0; i < n ; i++)
{
point = a[i];
b[point]++;
}
for(int j = 0; j < MAX ; j++)
{ //time千万不能在这里面赋值,不然会每一次把times置为0了
if(b[j] > times)
{
max = j;
times = b[j];
}
}
if(times > n/2)
printf("存在%d,次数为:%d\n", max,times);
else
printf("不存在\n");
}
int main(int argc, char const *argv[])
{
int a[9] = {3,4,5,7,5,3,3,3,8};
find_more(a,9);
return 0;
}