电话聊天狂人

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

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

输入格式:

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

输出格式:

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

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

输出样例:

13588625832 3

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define KEYLENGTH 13
#define MAXTABLESIZE 100001
typedef char ElementType[KEYLENGTH];
typedef int Index;

typedef struct LNode* PtrToLNode;
struct LNode{
	ElementType Data;
	int cnt;
	PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

typedef struct TblNode *HashTable;
struct TblNode {
	int TableSize;
	List Heads;
};

HashTable CreateTable( int TableSize );
Position Find( HashTable H, ElementType Key );
Index Hash( ElementType Key, int TableSize );
int NextPrime( int N );
void Insert( HashTable H, ElementType Key );
void ScanAndOutput( HashTable H );
void DestroyTable( HashTable H );

int main(){
	//freopen("C:\\in.txt","r", stdin);
	int N, i;
	scanf("%d", &N);
	HashTable H;
	ElementType Key;
	H = CreateTable( N*2 );
	for( i=0; i<N*2; i++){
		scanf("%s", Key);
		Insert( H, Key );
	}
	ScanAndOutput(H);
	DestroyTable( H );
	return 0;
}

void DestroyTable( HashTable H ){
	int i;
	Position P, Tmp;
	for( i=0; i<H->TableSize; i++ ){
		P = H->Heads[i].Next;
		while( P ){
			Tmp = P->Next;
			free( P );
			P = Tmp;
		}
	}
	free( H->Heads );
	free( H );
}

void ScanAndOutput( HashTable H ){
	int i;
	int N = 0;
	int max = 0;
	Position P;
	ElementType Key;
	for( i=0; i<H->TableSize; i++){
		P = H->Heads[i].Next;
		while( P ){
			if(max<P->cnt){
				max = P->cnt;
				strcpy(Key, P->Data);
				N = 1;
			}
			else if( max == P->cnt)
			{
				if(strcmp(Key, P->Data)>0)
					strcpy( Key, P->Data);
					N++;
				}
				P = P->Next;
		}
	}
	printf("%s %d", Key, max);
	if(N>1) printf(" %d", N);
	printf("\n");
}

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].cnt = 0;
	}
	return H;
}

Index Hash( ElementType Key, int TableSize ){
	return atoi(Key+6) % TableSize;
}

int NextPrime( int N ){
	int i, p = ( N%2 )? N+2: N+1;
	while ( p<= MAXTABLESIZE ) {
		for( i = (int)sqrt(p); i>2; i-- )
			if( !(p%i) ) break;
		if( i==2 ) break;
		else p += 2;
	}
	return p;
}

Position Find( HashTable H, ElementType Key ){
	Position P;
	Index Pos;
	Pos = Hash(Key, H->TableSize);
	P = H->Heads[Pos].Next;
	while( P&& strcmp( P->Data, Key))
		P = P->Next;

	return P;
}

void 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 );
		Pos = Hash( Key, H->TableSize );
		NewCell->Next = H->Heads[Pos].Next;
		NewCell->cnt = 1;
		H->Heads[Pos].Next = NewCell;
	} else {
		P->cnt++;
	}
}

  

 
时间: 2024-11-06 12:29:27

电话聊天狂人的相关文章

7-14 电话聊天狂人

7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10?5??),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔.如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数. 输入样例: 4 13005711862 13588625832 1

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

给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤10?5??),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔.如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数. 输入样例: 4 13005711862 13588625832 135057118

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

给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤10?5??),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔.如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数. 输入样例: 4 13005711862 13588625832 135057118

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

给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10?5??),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔.如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数. 输入样例: 4 13005711862 13588625832 13505711862 1308862

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

给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔.如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数. 输入样例: 4 13005711862 13588625832 13505711862 13088625832 1

基础实验5-2.2 电话聊天狂人 (25分)-散列表

解题思路: 用散列表(链表结构) 1.计算散列表长度(取比输入数据大一点的素数p) 2.构造散列函数 3.读入数据,求出散列位置插入 4.一边遍历散列表,一边求出现最多的电话狂人 #include <stdio.h> #include <malloc.h> #include <string.h> #include <math.h> #define KeyLength 11 #define ElemType char typedef enum {false,t

郁闷心情——电话聊天排解法

昨天下午的心情非常的糟糕,就像北京的天气一样,阴霾霭霭,没有蓝天,没有白云,没有微风,甚至连亲爱的太阳都看不到.当然,我的自我调节能力还是有的,我不希望他人的负面情绪影响到我,我不希望自己传递出去的是一些负面的信息,我也更不希望重复犯同样的错误或者总是受他人的掣肘.所以,我提醒自己要不断的学习,不断的提升和完善自我,虽然,我也觉得自己不是一个特别聪明的人,不过每天进步一点点,坚持下去,持续不断的进步,至少能够不断的超越自我也是一件极为开心的事情. 事情是这样的,我现在的工作是比较杂的,有三四个项

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

PTA数据结构与算法题目集(中文)  7-14 7-14 电话聊天狂人 (25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔.如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数. 输入样例: 4 130057

191027时间安排

总结我前几次的安排,太相信自己,过于自信,忘记了自己已不是从前的自己,一下子跨越太大,导致自己这几天焦虑,然而忘记了我还有完完整整的一年,眼光短浅.进而导致学习效率不增反倒低了很多. 起床过早,工作前是能做到,但是工作时习惯7点(双休日8.9点)左右醒,突然5点多,身体定是会反抗的,如今稳定在6:30左右. 娱乐时间较少,工作时每天2个小时的娱乐.游戏时间,前两个星期过渡到一个小时,然而这个星期直接骤减至0,这周的前几天还行,但是脑子的意志力很快会被耗光了,导致后几天和有网瘾一样,痛苦! 时间安