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 13588625832
4:上超时码
这个码我也要上,毕竟也是我努力的结果,敲码当中 最难受的事情了莫过于 你写的代码超时了,这就基本判定i你要重写了,毕竟你再怎么该也是原来的那个思路 时间复杂度不会降低多少的。
这个码用的是vector存的数据,只想说一句 我以前沉浸与vector的时代 宣告告一段落了 ,我要更加深入到map当中
//string 存的字符串
#include<bits/stdc++.h>
using namespace std;
int cnt;
int repeat(vector<string>&v1,string a)
{
for( int i = 0; i < v1.size(); i++)
{
if( v1[i] == a)//判断两个字符串是否相等
{
cnt++;
}
}
return cnt;
}
int main()
{
vector<string>v,v1;
int N,max = 0,count = 0;
string min = "9999999999";
string str1,str2;
cin >> N;
for( int i = 0; i < 2 * N; i++ )
{
string str;
cin >> str;
v.push_back(str);
}
for( int i = 0; i < 2 * N; i++ )
{
cnt = 0;
int temp = repeat(v,v[i]);
if( temp > max ) //求电话狂人
{
max = temp;
str1 = v[i];
}
}
//求取有相同 通话次数的电话狂人
for( int j = 0; j < v.size(); j++ )
{
cnt = 0;
int temp = repeat(v,v[j]);
if( temp == max ) //求电话狂人
{
v1.push_back(v[j]);
}
}
// for( int i = 0; i < v1.size(); i++)
// cout << v1[i] << ' ';
//去除 vector容器当中 重复的元素
sort(v1.begin(), v1.end());
//unique(v1.begin(),v1.end()); //将重复的元素放到数组的最后面
v1.erase(unique(v1.begin(), v1.end()), v1.end());
for( int j = 0; j < v1.size(); j++ )
{
if(v1[j] < min)
{
min = v1[j];
}
}
// cout << v1.size();
// cout << count << endl;
if( v1.size() == 1 )
cout << str1 << ' ' << max;
else
cout << min << ' ' << max << ' ' << v1.size();
}
最后还是希望陌生的你 加油 !