给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤105),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
struct node{
int count;
struct node*next;
string seq;
};
void findmax(node&nd, string &maxnum, int &maxnum_minseq, int &sameperson)
{
if (nd.count >= maxnum_minseq)//找出数量最多的号码
{
if (nd.count == maxnum_minseq)
{
sameperson++;
if (nd.seq < maxnum){ maxnum = nd.seq; }
}
else
{
maxnum = nd.seq;
maxnum_minseq = nd.count;
sameperson = 1;
}
}
}
int Lhash(const string &a,int TOTAL);//哈希函数
int main()
{
int N;
scanf("%d", &N);
node *a = new node[2*N];//链节点
for (int i = 0; i < 2*N; i++)//初始化
{
a[i].count = 0;
a[i].seq = "";
a[i].next = NULL;
}
string tmp;
tmp.resize(11);
string maxnum = "2";
int maxnum_minseq = -1;
int sameperson = 0;//聊天次数相同的聊天狂人的个数
for (int i = 0; i < N * 2; i++)//输入的同时建立哈希表,同时找出最大值
{
scanf("%s", &tmp[0]);
int hashnum = Lhash(tmp,2*N);
node *next = &a[hashnum];
node*pre = NULL;
bool flag = false;
do
{
if (next->seq == tmp || next->seq == "")
{
next->seq = tmp;
flag = true;
next->count++;//相同加1
findmax(*next, maxnum, maxnum_minseq, sameperson);
break;
}
pre = next;
next = next->next;
} while (next);
if (!flag)
{
node*ptmp = new node{1,NULL,tmp};
pre->next = ptmp;
findmax(*ptmp, maxnum, maxnum_minseq, sameperson);
}
}
cout << maxnum << " " << maxnum_minseq << endl;
if (sameperson > 1)
cout << maxnum << " " << maxnum_minseq << " " << sameperson << endl;
system("pause");
//释放内存
delete[] a;
return 0;
}
int Lhash(const string &a,int TOTAL)//哈希函数
{
//数字分割
string first;
first.assign(a, 0, 8);
int one = stoi(first);
return one%TOTAL;
}