0
点赞
收藏
分享

微信扫一扫

SWUST OJ 1231: 寻找出现次数最多的数(选做)

Villagers 2022-01-07 阅读 77

题目描述

给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。

输入

输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。

输出

输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。

样例输入

6
10 1 10 20 30 20

样例输出

10

参考程序

#include<stdio.h>
#include<stdlib.h>

typedef struct LNode
{
	int data, sum;
	struct LNode *next;
}LinkNode;

void Creat(LinkNode *&L, int n)
{
	/*创建长度为n的单链表*/ 
	L = (LinkNode *) malloc (sizeof(LinkNode));
	LinkNode *p, *q;
	q = L;
	for(int i=0; i<n; i++)
	{
		p = (LinkNode *) malloc (sizeof(LinkNode));
		scanf("%d", &p->data);
		q->next = p;
		q = p;
	}
	q->next = NULL;
}

void merge(LinkNode *&L)
{
	/*删除L->data相同节点,并计数在L->sum中*/ 
	LinkNode *p, *q, *r;
	p = L->next;
	while(p != NULL)
	{
		q = p;
		p->sum = 1;
		while(q->next != NULL)
		{
			if(p->data == q->next->data)
			{
				p->sum++;
				r = q->next;
				q->next = r->next;
				free(r);
			}
			else	q = q->next;
		}
		p = p->next;
	}
}

void ComNode(LinkNode *L)
{
	/*比较L->sum是否相同,如果相同则输出最小的L->data*/
	LinkNode *p, *q, *r;
	p = L->next;
	r = L->next;
	int maxsum = p->sum;
	int min;
	while( r != NULL)
	{
		if(maxsum < r->sum)
		{
			maxsum = r->sum;
		}
		min = r->data;
		r = r->next;
	}
	while( p != NULL)
	{
		if(p->sum == maxsum && p->data < min)
			min = p->data;
		p = p->next;
	}
	printf("%d", min);
}

int main()
{
	int n;
	LinkNode *L, *p;
	scanf("%d", &n);
	Creat(L, n);
	merge(L);
	ComNode(L);
	return 0;
}



注意

该程序仅供学习参考!

举报

相关推荐

0 条评论