XTU-OJ 1133-最近联系人

Description

有一个通话的记录,请找出联系最多的联系人名字。

输入

第一行是一个整数N,表示样例的个数。

每个样例从”START”开始,”END”结束,其间每行一个联系人的名字,名字都是小写英文,长度不超过16个字符,联系人数不超过20人。

输出

每行输出一个样例的结果,如果有多个名字符合条件,请输出字典序最小的那个人的名字。

Sample Input

2
START
eric
john
eric
END
START
eric
alice
END

Sample Output

eric
alice

解题思路: strcmp() 、 strcpy()  两个c库函数(自学)。 头文件  #include

先处理输入,当 输入字符串 == "END" 时停止输入。 然后对名字根据字典序进行排序,其余看代码注释。

字典序:从字符第一位开始往后依次比较,同位次中,字符较小的,字典序小。a < b、 aa < ab 、 aab < aba。 

#include 
#include 

int N,cnt,num,p,maxP;
char name[22][20],maxPeople[20];
char flag[5] = {'E','N','D'};

int main()
{
    scanf("%d",&N);
    while ( N --)
    {
        cnt = num = 0;
        scanf("%s",name[0]);                            // 输入 START;
        while (1)
        {
            scanf("%s",name[++cnt]);
            if (strcmp(name[cnt],flag) == 0)    break;  // 输入 END后停止输入
        }

        for (int i = cnt-1; i > 0; i --)                // 冒泡排序(让名字按字典序排序)
        {
            for (int j = 1; j < i; j ++)
            {
                if (strcmp(name[j],name[j+1]) > 0)
                {
                    char t[20] = {0};
                    strcpy(t,name[j]);
                    strcpy(name[j],name[j+1]);
                    strcpy(name[j+1],t);
                }
            }
        }
        p = maxP = 1;                       // 默认输出第一个人
        strcpy(maxPeople,name[1]);
        for (int i = 2; i < cnt; i ++)
        {
            if (strcmp(name[i],name[i-1]) == 0)     // 如果后面的和前面的是同一个人,计数++
            { 
                p ++;
                if (p > maxP)                       // 如果这个人出现次数最多,记录下来
                {
                    maxP = p;
                    strcpy(maxPeople,name[i]);
                }
            }
            else
                p = 1;                              // 如果前后不是同一个人,则重新计数
        }
        printf("%s\n",maxPeople);
    }
    return 0;
}

你可能感兴趣的:(湘大OJ练习解析,算法,数据结构)