7-6 电话聊天狂人 (15 分)
作者:互联网
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入格式:
输入首先给出正整数N(≤105),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出格式:
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
输入样例:
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832
输出样例:
13588625832 3
解题思路:
由于这里存在要记录手机号码,并计算手机号码出现的次数,并且题目要求如果出现多个聊天狂人,需要输出所有狂人中最小的号码,这时我们可以用map集合中的TreeMap以键值对的形式存储,因为TreeMap是用来存储键值映射关系的,并且不允许出现重复键,在TreeMap内部是通过二叉树的原理来保证键的唯一性,因此TreeMap中所有的键都是按照某种顺序排列的,所以我们就不需要关心最后需要输出最小的号码的问题,最后比较次数并计算狂人的个数输出即可
import java.io.*;
import java.util.TreeMap;
public class 电话聊天狂人 {
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
//输入通话记录条数
int n= Integer.parseInt(bf.readLine());
//定义存储通话记录条数的map集合
TreeMap<String, Integer> map=new TreeMap<String,Integer>();
for (int i = 0; i < n; i++) {
String[] tele=bf.readLine().split(" ");
if(map.containsKey(tele[0])){
//这个号码有多条通话记录
map.put(tele[0],map.get(tele[0])+1);
}else {
//这个号码还没有通话记录
map.put(tele[0],1);
}
if(map.containsKey(tele[1])){
map.put(tele[1],map.get(tele[1])+1);
}else {
map.put(tele[1],1);
}
}
//分别记录聊天狂人的号码,次数,和聊天狂人的个数
String telephone="";
int max=0,men=0;
for (String str:map.keySet()) {
if(map.get(str)>max){
max=map.get(str);
telephone=str;
men=1;
}else if(map.get(str)==max){
men++;
}
}
//聊天狂人不止一个
if(men>1){
System.out.println(telephone+" "+max+" "+men);
}else {
System.out.println(telephone+" "+max);
}
}
}
标签:map,15,max,通话记录,TreeMap,tele,聊天,狂人 来源: https://blog.csdn.net/Lilianach/article/details/122349352