pta 数据结构 7-1 电话聊天狂人 (25分) 简单实现
7-1 电话聊天狂人 (25分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3

使用开散列 十分简单的实现方法 欢迎改进意见
#include<stdio.h> #include<stdlib.h> typedef struct u_node node; typedef node* pos; int maxtimes = 1; struct u_node{ int times; long long int num; node* next; }bucket[10001]; pos createnode(long long int num) { pos p = NULL; p = (pos)malloc(sizeof(node)); p->times = 1; p->num = num; p->next = NULL; return p; } void addtonode(pos * head,pos p) { if(!(*head)){ *head = p; } else { pos temp = *head; int flag = 0; while(1) { if(temp->num == p->num) { flag = 1; temp->times++; if(temp->times>maxtimes)maxtimes = temp->times; break; } if(temp->next)temp = temp->next; else break; } if(flag==0)temp->next = p; } } int main(){ // printf("%d",bucket[0]); int n; long long int telenum; scanf("%d",&n); int rank; for(int i=0;i<2*n;i++) { scanf("%lld",&telenum); rank = telenum / 1000000; rank = rank % 10000; // printf("%d \n",rank); addtonode(&bucket[rank].next,createnode(telenum)); } int flag = 0; int geshu; long long int mintelenum; for(int i=0;i<10000;i++) { if(bucket[i].next) { pos temp = bucket[i].next; while(temp){ if(temp->times == maxtimes ){ if(flag == 0){ geshu = 1; flag = 1; mintelenum = temp->num; pos temp1 = temp; while(temp1) { if(temp1->times == maxtimes&&temp1->num<mintelenum) mintelenum = temp1->num; temp1 =temp1->next; } } else { if(temp->times == maxtimes) { geshu++; } } } temp = temp->next; } } } printf("%lld %d",mintelenum,maxtimes); if(geshu>1)printf(" %d",geshu); return 0; }
浙公网安备 33010602011771号