电话聊天狂人
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤10^5)??,为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
分析
可以用排序可以用hash,因为在学习hash就照着代码码了一下,还是有很多细节的
代码如下
#include<iostream>
#include<map>
#include<string.h>
#include<math.h>
using namespace std;
typedef struct lnode* list;
typedef char elem[12];
struct lnode{
elem nums;
int count=9;
lnode* next;
};
typedef struct tblnode* hashtable;
struct tblnode{
int tablesize;
list heads;
};
int Hash(int key,int p){
return key%p;
}
int nextprime(int n){
int i,p=(n%2)?n+2:n+1;
while(p<1000000){
for(i=sqrt(p);i>2;i--)
if(!(p%i)) break;
if(i==2) break;
else p+=2;
}
return p;
}
hashtable createtable(int tablesize){
hashtable h=(hashtable)malloc(sizeof(struct tblnode));
h->tablesize=nextprime(tablesize);
h->heads=new lnode[h->tablesize];
for(int i=0;i<h->tablesize;i++){
h->heads[i].nums[0]='\0';
h->heads[i].next=NULL;
h->heads[i].count=0;
}
return h;
}
list find(hashtable h,string key){
list p;
int pos=Hash(stoi(key.substr(6,key.size()-6)),h->tablesize);
p=h->heads[pos].next;
while(p&&key!=p->nums)
p=p->next;
return p;
}
bool Insert(hashtable h,elem key){
list p,newcell;
int pos;
p=find(h,key);
if(!p){
newcell=new lnode();
strcpy(newcell->nums,key);
newcell->count=1;
pos=Hash(atoi(key+6),h->tablesize);
newcell->next=h->heads[pos].next;
h->heads[pos].next=newcell;
return true;
}
else{
p->count++;
return false;
}
}
void scanandoutput(hashtable h){
int i,maxcnt=0,pcnt=0;
list ptr;
elem minphone;
for(i=0;i<h->tablesize;i++){
ptr=h->heads[i].next;
while(ptr){
if(ptr->count>maxcnt){
maxcnt=ptr->count;
strcpy(minphone,ptr->nums);
pcnt=1;
}
else if(ptr->count==maxcnt){
pcnt++;
if(strcmp(ptr->nums,minphone)<0)
strcpy(minphone,ptr->nums);
}
ptr=ptr->next;
}
}
pcnt>1?printf("%s %d %d",minphone,maxcnt,pcnt):printf("%s %d",minphone,maxcnt);
}
int main(){
int N;
cin>>N;
elem no;
hashtable h=createtable(2*N);
for(int i=0;i<N;i++){
scanf("%s",no); Insert(h,no);
scanf("%s",no); Insert(h,no);
}
scanandoutput(h);
return 0;
}