题目描述
公司会把每个月出现BUG的人都记录下来,然后月底复盘时会统计该月BUG数最多的人,请帮忙统计出BUG数最多的两个人。
输入
读入N(3<=N<=10000),表示该月出现BUG的总次数,后面N行表示每次BUG的所属人(人名均为英文字母,且长度不超过10,并且保证同一个名字均为连续出现)
输出
样例
6
Faker
Faker
Faker
Xiaohu
UZI
UZI
输出
Faker UZI
#include<stdio.h>
#include<string.h>
int main()
{
char a1[10000][13],a2[10000][13];
int i,j,k,n,flag,a[10000]={0},b1,b2,b3;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
gets(a1[i]);
}
k=0;
for(i=0;i<n;i++) //从这里开始,讲每个出现过的字符串放在另一个数组str1[]中,保证在每种字符串都在str1[]中出现,且只出现一次;//
{
flag=1;
for(j=0;j<n;j++)
{
if(strcmp(a1[i],a2[j])==0)
{
flag = 0;
break;
}
}
if(flag==1)
{
strcpy(a2[k],a1[i]);
k++;
}
}//到这结束
for(i=0;i<k;i++)//统计每种字符串出现的次数//
{
for(j=0;j<n;j++)
{
if(strcmp(a1[j],a2[i])==0)
{
a[i]++;
}
}
}//到此结束//
b1 = a[0];
b2 = 0;
for(i=1;i<k;i++)
{
if(b1<a[i])
{
b1=a[i];
b2 = i;
}
}
printf("%s ",a2[b2]);//输出次数最多的//
if(b2==0)
{
b1=0;
b3=0;
for(i=1;i<k;i++)
{
if(a[i]>b1)
{
b1=a[i];
b3=i;
}
}
}
else{
b1=0;
b3=0;
for(i=0;i<k;i++)
{
if(i==b2)
continue;
if(a[i]>b1)
{
b1=a[i];
b3=i;
}
}
}
printf("%s ",a2[b3]);//输出次数排第二的//
return 0;
}
总结:
这种题要把每种字符串的种类在统计到另一个数组中,在经过两者的比较,统计次数,最后在每种字符串出现的次数中找寻最多的和其次的;
注释
普通数组没有赋初值,默认的数组元素值是随机数,不是0。
如果在定义数组时,数据类型前面加上关键字static,数组变成了静态数组;或者把数组定义在函数的外面,成为全局变量数组,这时数组元素的值自动赋值为0。
那要看你指的不赋初值是哪种
如果是char a[10];
那这10个元素都是随机的
如果是char a[10] = {‘a’,‘b’,‘c’};
那除了赋值的3个元素, 其他都是0