电话聊天狂人

Posted A-Little-Nut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了电话聊天狂人相关的知识,希望对你有一定的参考价值。

电话聊天狂人

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

输入格式:
输入首先给出正整数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;
} 

以上是关于电话聊天狂人的主要内容,如果未能解决你的问题,请参考以下文章

5-14 电话聊天狂人 (25分)

7-113 电话聊天狂人 (25分)

7-14 电话聊天狂人(25 分)

11-散列1 电话聊天狂人 (25 分)

PTA 5-14 电话聊天狂人 (25分)

基础实验5-2.2 电话聊天狂人 (25分)-散列表