全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案

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

输入格式:

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

输出格式:

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

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

输出样例:

13588625832 3

解答:

没什么可说的,视频已经给答案了。虽然计算hash的方式可能比较随意(其实比较大型的程序都有一套很精密的hash计算法则),但是毕竟是做个题罢了,就用视频介绍的方式吧。

程序代码:

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;
#define KEYLENGTH 11 // 关键词字符串的最大长度
#define MAXD 5 //
// 关键词类型用字符串
typedef char ElementType[KEYLENGTH + 1];
typedef int Index; // 散列地址类型
typedef struct LNode *PtrToLNode;
struct LNode {ElementType Data;PtrToLNode Next;int Count;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
typedef struct TblNode *HashTable;
struct TblNode { // 散列表结点定义 int TableSize; // 表的最大长度 List Heads; // 指向链表头结点的数组
};
#define MAXTABLESIZE 1000000
int NextPrime(int N)
{ // 返回大于N且不超过MAXTABLESIZE的最小素数 int i, p = (N % 2) ? N + 2 : N + 1; //从大于N的下一个奇数开始 while (p <= MAXTABLESIZE) {for (i = (int)sqrt(p); i>2; i--)if (!(p%i)) break; // p不是素数 if (i == 2) break; // for正常结束,说明p是素数 else p += 2; // 否则试探下一个奇数 }return p;
}
int Hash(int Key, int P)
{ // 除留余数法法散列函数 return Key%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 = 0; i<H->TableSize; i++) {H->Heads[i].Data[0] = '\0'; H->Heads[i].Next = NULL;H->Heads[i].Count = 0;}return H;
}
Position Find(HashTable H, ElementType Key)
{Position P;Index Pos;// 初始散列位置 Pos = Hash(atoi(Key+KEYLENGTH-MAXD), H->TableSize);P = H->Heads[Pos].Next; // 从该链表的第1个结点开始 // 当未到表尾,并且Key未找到时while (P && strcmp(P->Data, Key))P = P->Next;return P; // 此时P或者指向找到的结点,或者为NULL
}
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 = 1;Pos = Hash(atoi(Key+KEYLENGTH-MAXD), H->TableSize);// 将NewCell插入为H->Heads[Pos]链表的第1个结点 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 = 0,PCnt = 0;ElementType MinPhone;List Ptr;MinPhone[0] = '\0';for (i = 0; i<H->TableSize; i++) { // 扫描链表 Ptr = H->Heads[i].Next;while (Ptr) {if (Ptr->Count > MaxCnt) { // 更新最大通话次数 MaxCnt = Ptr->Count;strcpy(MinPhone, Ptr->Data);PCnt = 1;}else if (Ptr->Count == MaxCnt) {PCnt++; // 狂人计数 if (strcmp(MinPhone, Ptr->Data)>0)strcpy(MinPhone, Ptr->Data); // 更新狂人的最小手机号码 }Ptr = Ptr->Next;}}printf("%s %d", MinPhone, MaxCnt);if (PCnt > 1) printf(" %d", PCnt);printf("\n");
}int main()
{int N, i;ElementType Key;HashTable H;scanf("%d", &N);H = CreateTable(N * 2); /* 创建一个散列表 */for (i = 0; i<N; i++) {scanf("%s", Key); Insert(H, Key);scanf("%s", Key); Insert(H, Key);}ScanAndOutput(H);//DestroyTable(H);system("pause");return 0;
}

测试结果:

算法 散列1 电话聊天狂人相关推荐

  1. PTA 11-散列1 电话聊天狂人

    PTA 11-散列1 电话聊天狂人 文章目录 PTA 11-散列1 电话聊天狂人 思路 Code 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10^ ...

  2. 11-散列1 电话聊天狂人 (25 分) (C语言)

    浙大版<C语言程序设计实验与习题指导(第3版)>题目集 11-散列1 电话聊天狂人 (25 分) 二.题解 c代码 11-散列1 电话聊天狂人 (25 分) 给定大量手机用户通话记录,找出 ...

  3. (C语言详解)11-散列1 电话聊天狂人(小白实现详细解释)

    本博文源于浙江大学<数据结构>.电话聊天狂人是非常有趣的一道题.姥姥在小白专场里从main函数搭建.重要函数编写.模块的改变与裁剪非常仔细的说明,下面就给出详细指导: 博主在前篇博文已经将 ...

  4. 11-散列1 电话聊天狂人

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

  5. 《数据结构》11-散列1 电话聊天狂人

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

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

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的 ...

  7. 11-散列1 电话聊天狂人分数 25作者 DS课程组单位 浙江大学

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字 ...

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

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

  9. 2.8 电话聊天狂人(散列,c)

    电话聊天狂人 题意理解与解法分析 输入格式: 输出格式: 输入样例: 输出样例: 程序框架搭建 输出狂人 模板的引用与裁剪 查找 插入函数 代码 运行 原题直达:11-散列1 电话聊天狂人 题意理解与 ...

最新文章

  1. PAT L3-002. 堆栈
  2. OpenStack Neutron运行机制解析概要
  3. BZOJ1734: [Usaco2005 Feb]Aggressive cows 愤怒的牛
  4. C#使用Sockets操作FTP【转载】
  5. 10-java程序的编译阶段
  6. layui表单验证方式大全
  7. 【Flink】flink 升级 the given -yarn-cluster does not contain a valid port
  8. Python之数据分析(random模块的正确用法)
  9. LeetCode 407. Trapping Rain Water II
  10. linux下redis安装教程
  11. csv交换到excel
  12. 2015-2017互联网产品经理笔试题
  13. 云台山风景美如画,四大网红打卡景点等你来!
  14. keyshot pro 10报许可证(*.lic)对该计算机无效解决办法
  15. 企业微信被别人登录了怎么办?有风险吗?
  16. 如何高效设计游戏——塔防游戏设计方案
  17. 基于属性的测试,hypothesis以及查找bug
  18. 微信小程序setData不起作用
  19. 大数据之路系列之Linux命令(01)
  20. 添加系统调用的方法,2.6.35(没有测试)

热门文章

  1. 开源机器人【01】 - 积木编程软件OpenBlock(类似scratch)
  2. 22、Android之 使用手机的 GPS 功能
  3. 【网站架构】一招搞定90%的分布式事务,实打实介绍数据库事务、分布式事务的工作原理应用场景
  4. 关于在百度上做SEO的几个技巧,你可能还不知道
  5. automotive industry is embracing change and agile transitioning
  6. 【Appium学习总结1】----原理
  7. GeneXus学习(一)安装与介绍
  8. php八字喜用神实现博客,八字喜用神,一定要注意
  9. MZOJ #82 总统竞选
  10. R语言 switch结构