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

输入格式:

输入首先给出正整数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. HeadFirst设计模式之装饰者模式

    一. 1.The Decorator Pattern attaches additional responsibilities to an object dynamically.Decorators ...

  2. 命令行添加用户的“作为服务登录”权利(添加Windows用户的时候,门道不是一般的多)good

    1.打开控制台(“开始”|“运行”中输入:MMC) 2.“文件”菜单|“添加删除管理单元”|“添加...”|选“安全模板”|“关闭”. 3.在“C:\Windows\Security\template ...

  3. 华为P6-U06 ROOT

    移动.联通.电信版P6均可成功的EMUI3.0开发版/稳定版 ROOT... - P6/P6s 花粉俱乐部 http://cn.club.vmall.com/forum.php?mod=viewthr ...

  4. AC题目简解-数据结构

    A - Japan  POJ 3067 要两条路有交叉,(x1,y1)(x2,y2)那么需要满足:(x1-x2)*(y1-y2)<0判断出这是求逆序的问题 树状数组求逆序,先通过自定义的比较器实 ...

  5. QPushButton 的checkable 属性

    只有setCheckable(true),这个button才能发射 toggle(bool) 信号. 而toggle(bool)代表了button 按下,弹起的状态像0,1的切换开关.

  6. SGU 130

    SGU130,用k条弦将一个圆分成k+1份的方法数. #include <iostream> #include <vector> #include <string> ...

  7. 安装Ubuntu双系统系列——64位Ubuntu安装H3C的INode客户端

    学校使用的是Inode客户端认证上网的.如果是使用Ubuntu 32位版本,可以完美地安装并能够连接到网站.但是如果安装的是Ubuntu desktop 12.10 amd64版本,则发现之前的&qu ...

  8. python学习笔记五--文件

    任何情况下文本文件在Python里均是字符串模式. 一.创建一个文件,并写入: 函数open(文件名,w) 二.打开一个文件,并读取: 函数open(文件名,r),“r”是默认值,可以不用写 三.使用 ...

  9. RTL 与 technology schematic的区别,包含概念与实例

    2013-06-25 16:40:45 下面是xilinx官网上的问答贴: http://china.xilinx.com/support/answers/41500.htm#solution The ...

  10. PHP微信公众平台开发1 配置接口

    1.简介 微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字.图片.语音的全方位沟通.互动. 2.通讯机制 3.注册微信公众 ...