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[] ...
随机推荐
- 在其他的电脑上配置绿色Jre+tomcat运行环境
其他的同事要使用我们的web程序(基于tomcat的web程序).所以要求是对方的电脑任何程序都不需要安装,把我们的包拷贝过去,直接执行批处理就可以运行. 经过了一番摸索,实现方式如下: 1,准备jr ...
- Qt: 访问容器(三种方法,加上for循环就四种了)good
#include <iostream>#include <QString>#include <QList>#include <QListIterator> ...
- 【今日推荐】10大流行的 Metro UI 风格的 Bootstrap 主题和模板
1. BootMetro 基于 Twitter Bootstrap 的简单灵活的 HTML.CSS 和 Javascript 框架,Win8 风格,大爱啊! 立即下载 效果演示 2. Boot ...
- 区分jquery中的offset和position
一次又一次地碰到需要获取元素位置的问题, 然后一次又一次地查offset和position的区别. 忍不了了, 这次一定得想办法记下来. position是元素相对于父元素的位置. 这个好记, par ...
- latex 写作
一.下载:http://www.ctex.org/CTeXDownload 二.bst文件的作用 在tex文件调用bib时,如 \bibliographystyle{Science} \bibliog ...
- 【转】Android Service被关闭后自动重启,解决被异常kill 服务
http://www.kaifajie.cn/android/10182-2.html 每次调用startService(Intent)的时候,都会调用该Service对象的onStartComman ...
- 【HDOJ】4358 Boring counting
基本思路是将树形结构转线性结构,因为查询的是从任意结点到叶子结点的路径.从而将每个查询转换成区间,表示从该结点到叶子结点的路径.离线做,按照右边界升序排序.利用树状数组区间修改.树状数组表示有K个数据 ...
- 12月上旬poj其他题
poj3170 1,4两遍bfs: poj3171 改一改poj2376即可 poj3172 dfs+剪枝 其实增长速度很快,n<=40,题目吓你的: poj3661 比较经典的dp:设f[i, ...
- oracle导入到Excel
一.从oracle到处数据到excel文件方法一.直接从PL/SQL中,全选数据,然后复制粘贴到excel中: 方法二.同样是通过PL/SQL,在数据列中,点击右键-->导出结果-->选择 ...
- Android学习系列(1)--为App签名(为apk签名)
写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐,前提是你有舞台展示,博客园就是这样的舞台.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签 ...