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;
}

 

posted @ 2018-11-23 19:45  王清河  阅读(672)  评论(0编辑  收藏  举报