电话聊天狂人

电话聊天狂人

给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。

输入格式:
输入首先给出正整数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;
} 
posted @ 2017-12-31 20:19  A-Little-Nut  阅读(301)  评论(0编辑  收藏  举报