一、题目
Description
比赛又一次开始了,看着气球漂浮在周边是多么兴奋的事情啊,但是告诉你一个秘密,裁判最喜欢做的事情就是猜一个问题,即数目最多的气球颜色。当比赛结束时,他们会数每种颜色的气球数目并公布结果。今年,他们决定将数气球的事情交给你做。
Input
测试数据第一行是一个N(0 < N <= 100),表示放飞的气球总数;紧接着的N行中每行表示一种气球颜色。每种气球颜色是由不多于15个小写字母组成。
Output
对于每组测试数据,对应一行输出颜色最多的气球颜色,测试数据能保证对应的结果唯一。
Sample Input
5
green
red
blue
red
red
Sample Output
red
二、解析
本题的思路非常简单,只要读颜色,读到之前读过的颜色那么个数就加一。但是在程序的设计上可能会有点复杂。
对于这个思路,我们先定义一个结构体BLN(还没学结构体的可以看下面另一种思路),参数包括字符串变量color和整型变量num,很容易看出这是用来相同颜色气球计数的,由于N的最大值为100,所以我们先创建个数为100的balloon变量用于计数。
接着对每个颜色分别进行读取,每读取一总颜色就遍历已有颜色,若已含有该颜色,则将该颜色数量加一,即BLN结构体中num值。若不存在,则新建该颜色,并将数量赋值为1。
在将所有颜色遍历完后,再对所有颜色的数量进行比较,输出最大数对应的颜色。
可能有人还没学过结构体,所以这里再用C风格字符串(字符串都还没学过的可以跳过这题了QAQ)做一个解题思路,代码未给出。
首先解题的大致思路还是一样的,只是变量的设置发生变化,我们需要创建一个字符串数组char *color[100]和整型的数组int num[100]作用和之前的结构体一样,只要将读入的颜色保存在color里,当读到重复的颜色是我们可以得到这个颜色在color中对应的角标,假设为i,那我们将num[i]进行加一就可以起到计数的效果,直到所有颜色读完,找出num中最大的数,同样得到角标j,输出color对应的颜色color[j]即可。
三、源码
#include <iostream>
#include <string>//在C语言中不能使用 可以使用char* 定义字符串
//C语言
//#include <stdio.h>
//#include <string.h>
using namespace std;
struct BLN
{
string color;//char *color;
int num;
};
int main_1003()
{
BLN balloon[100]; //颜色计数结构体
int color_num = 0; //颜色数量
bool IS_have_color = false; //是否有相同颜色
int N;
cin >> N;//scanf("%d",&N);
for (int i = 0; i < N; i++)
{
//读取每一个颜色
string color_in;//char *color_in;
cin >> color_in;//scanf("%s",&color_in);
//遍历已有颜色
for (int j = 0; j < color_num; j++)
{
if (balloon[j].color == color_in)
{
balloon[j].num++;
IS_have_color = true;
break;
}
}
//若颜色不存在 则新建颜色
if (!IS_have_color)
{
balloon[color_num].color = color_in;
balloon[color_num].num = 1;
color_num++;
}
IS_have_color = false;
}
int num_out = 0;
//循环遍历每个颜色个数 输出最大的颜色
for (int i = 0; i < color_num; i++)
{
num_out = balloon[i].num > balloon[num_out].num ? i: num_out;
}
cout << balloon[num_out].color;//printf("%s",balloon[num_out].color);
return 0;
}
四、深入研究
emmm还没想好