1. 程式人生 > >11-雜湊1 電話聊天狂人 (25 分)

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

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

輸入格式:

輸入首先給出正整數N(≤),為通話記錄條數。隨後N行,每行給出一條通話記錄。簡單起見,這裡只列出撥出方和接收方的11位數字構成的手機號碼,其中以空格分隔。

輸出格式:

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

輸入樣例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

輸出樣例:

13588625832 3
//未過程式碼 
#include<iostream>
#include<string>
#include<map>
using namespace std;
map<string,int> count;

void Input(string str){
        if(count.find(str) == count.end()) count[str] = 1;
        else count[str]++;

}

int main(){
    string str2,str1;
    int
n; char c; cin >> n; //c = getchar(); for(int i = 0; i < n; i++){ cin >> str1 >> str2; //c = getchar(); Input(str1); Input(str2); } string ans; int callcnt,num = 1; for(map<string,int>::iterator it = count.begin(); it != count.end(); it++){
if(it->second > num){ ans = it->first; callcnt = it->second; num = 1; }else if(it->second == num){ ++num; if(ans > it->first) ans = it->first; } } cout << ans <<" " << callcnt <<endl; if(num > 1) cout << " " <<num; }
//網上程式碼,通過,map
#include <iostream>  
#include <string>  
#include <unordered_map>  
using namespace std;

int main(void) {
    int n;
    cin >> n;

    unordered_map<string, int> myMap;
    myMap.reserve(n);
    char s[12];
    for (int i(0); i < 2 * n; ++i) {
        scanf("%s", s);
        ++myMap[s];
    }

    auto it = myMap.cbegin();
    int num = 1;                //人數  
    string minStr = it->first;  //最小號碼  
    int callCnt = it->second;   //呼叫次數  
    for (++it; it != myMap.cend(); ++it) {
        if (it->second == callCnt) {
            ++num;
            if (it->first < minStr) minStr = it->first;
        }
        else if (it->second > callCnt) {
            num = 1;
            minStr = it->first;
            callCnt = it->second;
        }
    }

    cout << minStr << " " << callCnt;
    if (num > 1) cout << " " << num;

    return 0;
}