PTA 5-14 电话聊天狂人 (25分)
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数NN(\le 10^5≤105),为通话记录条数。随后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分)的更多相关文章
- PTA 11-散列1 电话聊天狂人 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/722 5-14 电话聊天狂人 (25分) 给定大量手机用户通话记录,找出其中通话次数 ...
- 5-14 电话聊天狂人 (25分) HASH
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤105),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出 ...
- 7-14 电话聊天狂人(25 分)(Hash表基本操作)
7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单 ...
- PAT-7-14 电话聊天狂人
ps: 真不明白为什么水题不能一次ac 7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条 ...
- 电话聊天狂人 【STL】
7-2 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单起 ...
- PTA甲级1094 The Largest Generation (25分)
PTA甲级1094 The Largest Generation (25分) A family hierarchy is usually presented by a pedigree tree wh ...
- 【PTA 天梯赛训练】电话聊天狂人(简单map)
输入格式: 输入首先给出正整数N(≤10^5),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出 ...
- 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 ...
- PTA 05-树7 堆中的路径 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/713 5-5 堆中的路径 (25分) 将一系列给定数字插入一个初始为空的小顶堆H[] ...
随机推荐
- 如何将sql server数据库转化成sqlite数据库
今天在将sql server转化为sqlite的数据库的时候,遇到不少的问题,在网上搜了很长时间,都没有找到合适的软件将sql server转化成sqlite,其中用到了SqliteDev软件,在转化 ...
- SSH应该使用密钥还是密码?
关于SSH,几乎每个人都同意密钥要优于密码,更安全,并且更先进,但我并不同意这个观点. 虽然密钥的确可以更好,但它有着还没被意识到的严重风险,并且我认为比得到妥善管理的密码更不安全. 通常密钥更好的理 ...
- Flex Array内置排序方法的使用
在Array类中,提供内置的排序方法.排序是在软件开发的过程中,经常遇到的问题.通过这些内置的方法,可以快速轻便的进行排序操作. Array类提供sort方法对Array实例进行排序.sort方法没有 ...
- UVa 10213 (欧拉公式+Java大数) How Many Pieces of Land ?
题意: 一块圆形土地,在圆周上选n个点,然后两两连线,问把这块土地分成多少块? 分析: 首先紫书上的公式是错的,不过根据书上提供的思路很容易稍加修改得到正确答案! 然后推公式吧,这里用到平面图的欧拉公 ...
- poj 2185 (KMP)
完全不会啊…… 附一份题解:http://blog.sina.com.cn/s/blog_69c3f0410100tyjl.html var i,j,k,r,c,x:longint; ch:..,.. ...
- 纯干货,Spring-data-jpa详解,全方位介绍
本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求.这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring ...
- datagrid中需要填写长文本,扩展的textarea
$.extend($.fn.datagrid.defaults.editors, { textarea: {//textarea就是你要自定义editor的名称 init: function(cont ...
- 选择select框跳出信息
<html > <body > <select type="select" name=s1 onChange=alert("你选择了&quo ...
- ODAC连接远程Oracle数据库时,数据源名称orcl改为gscloud
今天用ODAC连接远程Oracle数据库时,怎么也连接不上, 更改配置文件的tnsname.ora,使之都一样,并完全配置正确还是出现错误,连接不上. 最后请大神一世,原来是数据源名称的问题. 把数据 ...
- [selenium webdriver Java]显示的等待同步
显示等待可以在执行下一次操作时,自定义等待条件 显示的等待只需要执行在需要同步的地方而不影响脚本的其他地方 Selenium WebDriver提供了WebDriverWait和ExpectedCon ...