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

输入格式:

输入首先给出正整数NN(\le 10^5≤10​5​​),为通话记录条数。随后NN行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。

输出格式:

在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

输出样例:

13588625832 3
/*
* 就这道题而言:如果采取直接电话号码长度为11 直接排序O(11 * n * log n ) 然后在找出现最多的O(11 * n) 时间效率比采用散列表还要好点- -
1.上述方案在实际应用中不可行 应为会涉及到不断插入新号码的问题 每插入一个新号码都要重新进行排序。
可以考虑用散列表解决 这题哈希函数采用除留余数法 解决冲突采用分离链接法。
*/
#include "iostream"
#include "cmath"
#include "cstring"
using namespace std;
#define KEYLENGTH 11
typedef char ElementType[KEYLENGTH];
typedef int Index; /* 散列地址类型 */ struct LNode {
ElementType data;
LNode* next;
int count;
};
typedef LNode *ptrToLNode;
typedef ptrToLNode Position;
typedef ptrToLNode List;
typedef struct TblNode* HashTable;
struct TblNode { /* 散列表节点定义 */
int tableSize; /* 表的大小 */
List heads; /* 指向链表头结点的数组 */
};
#define MAXTABLESIZE 1000000
int nextPrime(int n) {
int i, p = (n % ) ? n + : n + ;
while (p < MAXTABLESIZE) {
for (i = sqrt(p); i > ; i--)
if (!(p%i))
break;
if (i == )
break;
else
p += ;
}
return p;
}
HashTable createTable(int tableSize) {
HashTable h;
int i;
h = (HashTable)malloc(sizeof(struct TblNode));
h->tableSize = nextPrime(tableSize);
h->heads = (List)malloc(h->tableSize* sizeof(struct LNode));
for (i = ; i < h->tableSize; i++) {
h->heads[i].data[] = '\0'; h->heads[i].next = NULL;
h->heads[i].count = ;
}
return h;
} int Hash(int p, int tableSize) { /* 设置映射的哈希函数 */
return p % tableSize; /* 采用除留余数法 */
} Position find(HashTable h , ElementType key) {
Position p;
Index pos;
pos = Hash(atoi(key+KEYLENGTH-),h->tableSize); /* 初始散列位置 */
p = h->heads[pos].next; /* 从该链表的第一个节点开始 */
while (p && strcmp(p->data, key)) /* 未到表尾 并且key未找到时 */
p = p->next;
return p;
} bool insert(HashTable h, ElementType key) {
Position p, newCell;
Index pos;
p = find(h, key);
if (!p) {
newCell = (Position)malloc(sizeof(struct LNode));
strcpy(newCell->data, key);
newCell->count = ;
pos = Hash(atoi(key + KEYLENGTH - ), h->tableSize); /* 初始散列位置 */
/* 头插法 将newCell作为h->heads[pos]的第一个结点 */
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, PCnt;
MaxCnt = PCnt = ;
ElementType MinPhone;
List ptr;
MinPhone[] = '\0';
for (i = ; i < h->tableSize; i++) {
ptr = h->heads[i].next;
while (ptr) {
if (ptr->count > MaxCnt) {
MaxCnt = ptr->count;
strcpy(MinPhone, ptr->data);
PCnt = ;
}
else if (ptr->count == MaxCnt) {
PCnt++;
if (strcmp(MinPhone, ptr->data) > )
strcpy(MinPhone, ptr->data);
}
ptr = ptr->next;
}
}
cout << MinPhone << " "<< MaxCnt ;
if (PCnt > )
cout << " "<<PCnt;
cout << endl;
} void destroyTable(HashTable h) {
int i;
Position p, temp;
for (i = ; i < h->tableSize; i++) {
p = h->heads[i].next;
while (p != NULL) {
temp = p->next;
free(p);
p = temp;
}
}
free(h->heads);
free(h);
}
int main() {
int n, i;
ElementType key;
cin >> n;
HashTable h = createTable( * n);
for (i = ; i < n; i++) {
cin >> key; insert(h, key);
cin >> key; insert(h, key);
}
scanAndOutput(h);
destroyTable(h);
return ;
}

PTA 5-14 电话聊天狂人 (25分)的更多相关文章

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

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/722 5-14 电话聊天狂人   (25分) 给定大量手机用户通话记录,找出其中通话次数 ...

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

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤10​5​​),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出 ...

  3. 7-14 电话聊天狂人(25 分)(Hash表基本操作)

    7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条数.随后N行,每行给出一条通话记录.简单 ...

  4. PAT-7-14 电话聊天狂人

    ps: 真不明白为什么水题不能一次ac 7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条 ...

  5. 电话聊天狂人 【STL】

    7-2 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条数.随后N行,每行给出一条通话记录.简单起 ...

  6. PTA甲级1094 The Largest Generation (25分)

    PTA甲级1094 The Largest Generation (25分) A family hierarchy is usually presented by a pedigree tree wh ...

  7. 【PTA 天梯赛训练】电话聊天狂人(简单map)

    输入格式: 输入首先给出正整数N(≤10^5),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出 ...

  8. PTA 10-排序5 PAT Judge (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/677 5-15 PAT Judge   (25分) The ranklist of PA ...

  9. PTA 05-树7 堆中的路径 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/713 5-5 堆中的路径   (25分) 将一系列给定数字插入一个初始为空的小顶堆H[] ...

随机推荐

  1. UIBezierPath画圆弧的记录

    UIBezierPath通过 - (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)s ...

  2. HeadFirst设计模式之单例模式

    一. 1.The Singleton Pattern ensures a class has only one instance, and provides a global point of acc ...

  3. ArcGIS学习记录—属性表的编辑与修改

    原文地址: ArcGIS问题:属性表的编辑与修改 - Silent Dawn的日志 - 网易博客 http://gisman.blog.163.com/blog/static/344933882009 ...

  4. Cobalt Strike

    http://www.77169.com/hack/201512/222080.shtm

  5. SQL数据库还原时备份集中的数据库备份与现有的数据库不同的解决办法

    SQL Server 2005数据库还原出错错误具体信息为:备份集中的数据库备份与现有的A数据库不同 具体操作如下:第一次:新建了数据库A,数据库文件放在E:\DB\A目录下,选中该数据库右键-任务- ...

  6. R语言学习笔记:取数据子集

    上文介绍了,如何生成序列,本文介绍一下如何取出其数据子集 取出元素的逻辑值 > x<-c(0,-3,4,-1,45,90,5) > x>0 [1] FALSE FALSE  T ...

  7. CentOS7.1 JDK安装 和 CentOS7.1配置yum源

    1.卸载自带OPENJDK #查看自身jdk java -verson #查看自身安装的java  rpm -qa | grep java #显示如下 python-javapackages-3.4. ...

  8. Windows下Vim设置

    进入安装目录,找到_vimrc文件,用文本编辑器打开,在前面加入下述内容 设置中文支持 " 设置编码自动识别, 中文引号显示 " set fileencodings=utf-8,c ...

  9. poj 2251 Dungeon Master( bfs )

    题目:http://poj.org/problem?id=2251 简单三维 bfs不解释, 1A,     上代码 #include <iostream> #include<cst ...

  10. C语言中的malloc和free

    最近在研究php自定义函数的实现,其中php自定义函数在传递参数时,是放到人为的一个栈中,这个跟写C程序时,参数入栈的这个栈还不一样,其中延伸到了 malloc 以及free 有人说在free(p)后 ...