PTA数据结构与算法题目集(中文) 7-14

PTA数据结构与算法题目集(中文)  7-14

7-14 电话聊天狂人 (25 分)

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

输入格式:

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

输出格式:

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

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

输出样例:

13588625832 3

(7-12 是简单的桶排序应用 7-13是排序的应用 至于排序在另一篇博客里写到了)题目分析:一道利用散列表(哈希表)的基础题 将数据读入后进行判断就可以了 需要注意要记录所有狂人的人数 那么在找到最新的那个狂人时候 将人数设为1 之后找到与他次数相同的认识 将人数加1

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<malloc.h>
  5 #include<math.h>
  6 #include<string.h>
  7 #define KEYLENGTH 11
  8 #define MAXTABLESIZE 10000
  9
 10 typedef char ElementType[KEYLENGTH + 1];
 11 typedef struct LNode* PtrToLNode;
 12 typedef PtrToLNode List;
 13 struct  LNode
 14 {
 15     ElementType Data;
 16     PtrToLNode Next;
 17     int TelTimes;
 18 };
 19
 20 typedef struct HblNode* HashTable;
 21 struct HblNode
 22 {
 23     int TableSize;
 24     List Heads;
 25 };
 26
 27 long Atoi(ElementType Tel)
 28 {
 29     long num = 0;
 30     int length = strlen(Tel);
 31     for (int i = 0; i < length; i++)
 32         num += num * 10 + Tel[i] - ‘0‘;
 33     return num;
 34 }
 35
 36 int NextPrime(int num)
 37 {
 38     int p = (num % 2) ? num + 2 : num + 1;
 39     int i;
 40     while (p<MAXTABLESIZE)
 41     {
 42         for (i = (int)sqrt(p); i > 2; i--)
 43             if (p % i == 0)
 44                 break;
 45         if (i == 2)
 46             break;
 47         else
 48             p += 2;
 49     }
 50     return p;
 51 }
 52
 53 int Hash(ElementType Tel,int TabelSize)
 54 {
 55     return atoi(Tel+5) % TabelSize;
 56 }
 57
 58 HashTable BuildHashTable(int TabelSize)
 59 {
 60     HashTable H = (HashTable)malloc(sizeof(struct HblNode));
 61     H->TableSize = NextPrime(TabelSize);
 62     H->Heads = (List)malloc(H->TableSize * sizeof(struct LNode));
 63     for (int i = 0; i < H->TableSize; i++)
 64     {
 65         H->Heads[i].Data[0] = ‘\0‘;
 66         H->Heads[i].Next = NULL;
 67     }
 68     return H;
 69 }
 70
 71 PtrToLNode Find(ElementType Tel, HashTable H)
 72 {
 73     int i = Hash(Tel,H->TableSize);
 74     PtrToLNode P = H->Heads[i].Next;
 75     while (P && strcmp(P->Data, Tel))
 76         P = P->Next;
 77     return P;
 78 }
 79
 80 void Insert(ElementType Tel, HashTable H)
 81 {
 82     PtrToLNode P, NewCell;
 83     P = Find(Tel, H);
 84     if (!P)
 85     {
 86         int i = Hash(Tel, H->TableSize);
 87         NewCell = (PtrToLNode)malloc(sizeof(struct LNode));
 88         strcpy(NewCell->Data, Tel);
 89         NewCell->TelTimes = 1;
 90         NewCell->Next = H->Heads[i].Next;
 91         H->Heads[i].Next = NewCell;
 92     }
 93     else
 94         P->TelTimes++;
 95 }
 96
 97 HashTable CreateHashTable()
 98 {
 99     int N;
100     scanf("%d", &N);
101     HashTable H = BuildHashTable(N);
102     N *= 2;
103     while (N--)
104     {
105         ElementType Tel;
106         scanf("%s", Tel);
107         Insert(Tel, H);
108     }
109     return H;
110 }
111 void Judge(HashTable H)
112 {
113     int TelTimes = -1;
114     PtrToLNode MinP=NULL;
115     PtrToLNode P=NULL;
116     int Persons = 0;
117     for (int i = 0; i < H->TableSize; i++)
118     {
119         P = H->Heads[i].Next;
120         while (P)
121         {
122             if (P->TelTimes > TelTimes)
123             {
124                 Persons = 1;
125                 MinP = P;
126                 TelTimes = P->TelTimes;
127             }
128             else if (P->TelTimes == TelTimes)
129                 Persons++;
130             P = P->Next;
131         }
132     }
133     if(Persons==1)
134         printf("%s %d", MinP->Data,MinP->TelTimes);
135     else
136         printf("%s %d %d", MinP->Data, MinP->TelTimes,Persons);
137 }
138
139 int main()
140 {
141     HashTable H = CreateHashTable();
142     Judge(H);
143     return 0;
144 }

原文地址:https://www.cnblogs.com/57one/p/11601673.html

时间: 2024-10-10 04:23:39

PTA数据结构与算法题目集(中文) 7-14的相关文章

PTA数据结构与算法题目集(中文) 7-16

PTA数据结构与算法题目集(中文)  7-16 7-16 一元多项式求导 (20 分) 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格. 输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0题目分析:要注意判断输入停止的标志 利用~scanf来判断 其它问题到没发现 (

PTA数据结构与算法题目集(中文) 7-27

PTA数据结构与算法题目集(中文)  7-27 7-27 家谱处理 (30 分) 人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究.实验中,使用计算机处理家谱.为了实现这个目的,研究人员将家谱转换为文本文件.下面为家谱文本文件的实例: John Robert Frank Andrew Nancy David 家谱文本文件中,每一行包含一个人的名字.第一行中的名字是这个家族最早的祖先.家谱仅包含最早祖先的后代,而他们的丈夫或妻子不出现在家谱中.每个人的子女比父母多缩进2个空格.

PTA数据结构与算法题目集(中文) 7-32

PTA数据结构与算法题目集(中文)  7-32 7-32 哥尼斯堡的“七桥问题” (25 分) 哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示. 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学. 这个问题如今可以描述为判断欧拉回路是否存在的问题.欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个无向图,问是否存在欧拉回路? 输

PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)

PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队. 输入格式: 输入第一行给出4个正整数N.M.S.D,其中N(2)是城市的个数,顺便假设城市的编号为0 ~ (:M是快速道路的条数

PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)

PTA数据结构与算法题目集(中文)  7-36 社交网络图中结点的“重要性”计算 (30 分) 7-36 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱.而结点根据其所处的位置不同,其在网络中体现的重要性也不尽相同. “紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的结点能够

PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)

PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数(将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符串AZDEG插入长度为1009的散列表中,我们首先将26个大写英文字母顺序映射到整数0~25:再通过移位将其映射为3:然后根据表长得到,即是该字符串的散列映射位置. 发生冲突时请

PTA 数据结构与算法题目集 6-1

单链表的反转 回顾题目戳这里 https://pintia.cn/problem-sets/15/problems/724 带头节点的反转代码 List Reverse( List L ){ List head = (List)malloc(sizeof(PtrToNode)); head->Next = NULL; List cur = L,nNode; while(cur){ nNode = cur->Next; cur->Next = head->Next; head->

[PTA] 数据结构与算法题目集 6-1 单链表逆转

List Reverse(List L) { List p, q; p = L; q = L; L = NULL; while (p) { p = p->Next; q->Next = L; L = q; q = p; } return L; } 原文地址:https://www.cnblogs.com/ruoh3kou/p/9975225.html

[PTA] 数据结构与算法题目集 6-2 顺序表操作集

//创建并返回一个空的线性表: List MakeEmpty() { List L; L = (List)malloc(sizeof(struct LNode)); L->Last = -1; //因为插入一个时,Last++,此时需为-1 return L; } //返回线性表中X的位置.若找不到则返回ERROR: Position Find(List L, ElementType X) { for (int i = 0; i <= L->Last; i++) { if (L->