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

输入格式:

输入首先给出正整数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. Java IO3:字符流

    字符流 字节流提供了处理任何类型输入/输出操作的功能(对于计算机而言,一切都是0 和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,一个Unicode字符占用2个字节,而 ...

  2. Servlet的一些细节问题

    Servlet的细节问题 1.一个已经注册的Servlet可以被多次映射即: <servlet> <!-- servlet的注册名 --> <servlet-name&g ...

  3. python脚本工具 - 4 获取系统当前时间

    #! /usr/bin/python import time current_time = time.strftime("%Y-%m-%d %H:%M") print curren ...

  4. 将非WPF window设为 WPF Window的Owner

    如果WPF Content是寄宿在Win32 窗体或Windows Form中,则在WPF模块中可能不会存在WPF Window(WPF模块的根可能是个UserControl).如果在WPF模块中弹出 ...

  5. PHP内置的Web Server的使用

    自PHP5.4之后 PHP内置了一个Web 服务器. 让我们来看看php Web Server的简单使用: 启动php Web Server php -S localhost:8080 通过 php ...

  6. Tomcat配置HTTPS方式

    简要记录主要步骤备忘 1.进入到jdk下的bin目录 2.输入如下指令 keytool -v -genkey -alias tomcat -keyalg RSA -keystore d:/tomcat ...

  7. Terrocotta - 基于JVM的Java应用集群解决方案

    前言 越来越多的企业关键应用都必须采用集群技术,实现负载均衡(Load Balancing).容错(Fault Tolerance)和灾难恢复(Failover).以达到系统可用性(High Avai ...

  8. RPi 2B SD read-only filesytem

    /**************************************************************************** * RPi 2B SD read-only ...

  9. Android 隐藏RadoiButton左边按钮

    声明方式 添加属性 android:button=“@null”? 代码方式 radioBtn.setButtonDrawable(new StateListDrawable());

  10. jquery的一些select操作小记

    添加option $("#ID option").each(function(){ if($(this).val() == 111){ $(this).remove(); } }) ...