11 雜湊1 電話聊天狂人(測試點2超時)

2021-09-22 22:35:40 字數 1686 閱讀 2617

中國大學mooc-陳越、何欽銘-資料結構

11-雜湊1 **聊天狂人 (25 分)

給定大量手機使用者聯絡歷史,找出其中通話次數最多的聊天狂人。

輸入首先給出正整數n(≤10​5​​),為聯絡歷史條數。隨後n行,每行給出一條聯絡歷史。簡單起見,這裡只列出撥出方和接收方的11位數字構成的手機號碼,其中以空格分隔。

在一行中給出聊天狂人的手機號碼及其通話次數,其間以空格分隔。如果這樣的人不唯一,則輸出狂人中最小的號碼及其通話次數,並且附加給出並列狂人的人數。

4

13005711862 13588625832

13505711862 13088625832

13588625832 18087925832

15005713862 13588625832

13588625832 3
題目寫得很顯然,為雜湊表查詢;

因為**號碼有11位,故使用摺疊法取雜湊key(摺疊3位測試點2會超時,需要摺疊4位);

衝突處理方法用分離鏈結法(雜湊頭表大小好定);

用乙個變數max_freq記錄通話最大次數,cnt_max[n/2+1]用來記錄同等次狂人數,n條記錄最多有n/2+1個不同的**號碼,max_tel[12]用來記錄最小且通話次數最多的**號碼,然後就開始讀入資料,每讀入乙個資料判斷一次,更新以上變數。最後按要求輸出即可。

**有部分冗長,時間有點緊,以後再簡化。

/***************2019.5.18-10:10-11:33(v1.0)  11:33-11:38(v2.0)**************/

//11-雜湊1 **聊天狂人 最大n超時 :應對策略:foldsize=10000;取四位 (v2.0)

#include#include#include#define foldsize 10000//用摺疊法取四位數字,故heads陣列為[0~9999] ,取foldsize為10000;

typedef struct lnode *list;

struct lnode;

//struct hashtableh;

int key(char tel[12])

int inserthash(list hash,char tel[12],int key)

if(p) p->freq++;

else

return p->freq;

} int main()

else if(pre_freq==max_freq)

out_key=key(out);

pre_freq=inserthash(hash,out,out_key);

if(pre_freq>max_freq)

else if(pre_freq==max_freq)

} printf("%s %d",max_tel,max_freq);

if(cnt_max[max_freq]>1)printf(" %d\n",cnt_max[max_freq]);

else printf("\n");

return 0;

}

11 雜湊1 電話聊天狂人

來自 pta 資料結構 聊天狂人 給定大量手機使用者聯絡歷史,找出其中通話次數最多的聊天狂人。輸入格式 輸入首先給出正整數n 10 5 為聯絡歷史條數。隨後n行,每行給出一條聯絡歷史。簡單起見,這裡只列出撥出方和接收方的11位數字構成的手機號碼,其中以空格分隔。輸出格式 在一行中給出聊天狂人的手機號...

11 雜湊1 電話聊天狂人

給定大量手機使用者聯絡歷史,找出其中通話次數最多的聊天狂人。輸入格式 輸入首先給出正整數n 10 5 為聯絡歷史條數。隨後n行,每行給出一條聯絡歷史。簡單起見,這裡只列出撥出方和接收方的11位數字構成的手機號碼,其中以空格分隔。輸出格式 在一行中給出聊天狂人的手機號碼及其通話次數,其間以空格分隔。如...

11 雜湊1 電話聊天狂人

11 雜湊1 聊天狂人 題意 給出n個聯絡歷史,每個聯絡歷史分別包含兩個 號碼,計算出通話次數最多的號碼和其通話次數。如果有多個通話次數最多的號碼,輸出號碼最小的那個且再輸出通話次數最多的號碼個數。思路 用map容器把每個號碼與通話次數聯立起來,最後遍歷一遍map找到通話次數最多的號碼。map會按照...