7-14 电话聊天狂人 (25 分)map做法 + 详解 + 思路分析
7-14 電話聊天狂人 (25 分)map做法
1:題目
給定大量手機用戶通話記錄,找出其中通話次數最多的聊天狂人。
輸入格式:
輸入首先給出正整數N(≤10
?5
?? ),為通話記錄條數。隨后N行,每行給出一條通話記錄。簡單起見,這里只列出撥出方和接收方的11位數字構成的手機號碼,其中以空格分隔。
輸出格式:
在一行中給出聊天狂人的手機號碼及其通話次數,其間以空格分隔。如果這樣的人不唯一,則輸出狂人中最小的號碼及其通話次數,并且附加給出并列狂人的人數。
輸入樣例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
輸出樣例:
13588625832 3
2:思路分析
來看碼的同學呀 一定要去學一下map容器,刷題刷到沒用過的知識并且挺重要的就趕緊去學
用了map 容器 其實就沒啥思路可分析的 ,這個容器太牛逼,存數據時已經將重復的元素個數累加好了 即最終狀態是一個號碼 對應一個 通話次數
但要注意的題目給的要求 如果有相同號碼時需要比較大小, 我糾結了半天,想這一串數字字符串怎么比較大小呀? 但自己敲了個demo來驗證 字符串的比較大小,才發現 原來是直接比較就可以不用糾結那么多
3:上碼
#include<bits/stdc++.h> using namespace std;int main(){int N,max = 0,count = 0;map<string,int>m;map<string,int>::iterator t;cin >> N;string maxid;for( int i = 0; i < N; i++ ){string str1,str2;cin >> str1 >> str2;m[str1]++; //也就是m[str]代表的就是 鍵值 m[str2]++; //如果遇到 相同的關鍵字 則 鍵值加一 if( m[str1] > max){max = m[str1];maxid = str1;} if( m[str2] > max ){max = m[str2];maxid = str2;}// cout << m[str1] << ' ' << m[str2] << endl; }for( t = m.begin(); t != m.end(); t++ ){if(t->second == max){count++; }}if(count == 1){cout << maxid << ' ' << max;}else{for( t = m.begin(); t != m.end(); t++ ){if(t->second == max){cout << t->first <<' '<< max <<' '<< count;break; }} }}//4 //13005711862 13588625832 //13505711862 13005711862 //13588625832 13005711862 //15005713862 135886258324:上超時碼
這個碼我也要上,畢竟也是我努力的結果,敲碼當中 最難受的事情了莫過于 你寫的代碼超時了,這就基本判定i你要重寫了,畢竟你再怎么該也是原來的那個思路 時間復雜度不會降低多少的。
這個碼用的是vector存的數據,只想說一句 我以前沉浸與vector的時代 宣告告一段落了 ,我要更加深入到map當中
最后還是希望陌生的你 加油 !
總結
以上是生活随笔為你收集整理的7-14 电话聊天狂人 (25 分)map做法 + 详解 + 思路分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 肠粘连怎么回事
- 下一篇: java中编译类型的方法 和 运行时的类