给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤1000000),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
My code:
#include<stdio.h>
#include<math.h>
#include<stdbool.h>
#define KEYLENGTH 11 //phone number has 11 digits
typedef char ElementType[KEYLENGTH+1]; //string end with '\0', so do not forget +1
typedef int Index;
typedef struct LNode *PtrToLNode;
struct LNode
{
ElementType Data;
PtrToLNode Next;
int Count;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
typedef struct TblNode *HashTable;
struct TblNode
{
int TableSize;
List Heads;
};
//typedef PtrToTblNode HashTable;
int NextPrime(int N);
HashTable CreateTable(int N);
int Hash(int Key, int p); //使用简单的除留余数法 h(Key) = Key(最后5位) mod p
Position Find(HashTable H, ElementType Key);
bool Insert(HashTable H, ElementType Key);
ScanfAndOutput(HashTable H);
void Destroy(HashTable H); // remember to destroy HashTable in the end, be a good programmer
int main()
{
int N,i;
HashTable H;
ElementType Key;
scanf("%d", &N);
H = CreateTable

通过分析大量手机用户通话记录,利用哈希表(散列表)数据结构,找到通话次数最多的‘聊天狂人’。程序首先读取通话记录条数N,然后逐条处理记录,使用散列表存储每个手机号码及其对应的通话次数。最终,输出通话次数最多的号码及其通话次数,若存在多个狂人,则输出最小号码及并列人数。

266

被折叠的 条评论
为什么被折叠?



