刷题之单生狗和电话聊天狂人

简介: 刷题之单生狗和电话聊天狂人

1、单生狗

1)题目

“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

输入格式:

输入第一行给出一个正整数 N(≤50000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤10000),为参加派对的总人数;随后一行给出这 M 位客人的 ID,以空格分隔。题目保证无人重婚或脚踩两条船。

输出格式:

首先第一行输出落单客人的总人数;随后第二行按 ID 递增顺序列出落单的客人。ID 间用 1 个空格分隔,行的首尾不得有多余空格。

输入样例:

3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333

输出样例:

 5
 10000 23333 44444 55555 88888

2)题目解读

题目要求我们先输入一个数字N,然后再输入N对 夫妻/伴侣 的对数。还要输入一个数字M,然后再输入M个ID 号。我们需要判断这些ID号是否成对匹配N对 夫妻/伴侣 中的ID号。并输出其中未匹配的ID号数量及ID号,要求ID号按递增顺序输出。

3)代码

import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
  public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n= Integer.parseInt(sc.nextLine());
        String[][] arr=new String[n][2];
        for (int i=0;i<arr.length;i++){
            String s=sc.nextLine();
            arr[i]=s.split(" ");
        }
        int m= Integer.parseInt(sc.nextLine());
        String[] arr1;//去除夫妻/伴侣ID后保留再arr1数组中,再进行sort排序
        String ss=sc.nextLine();
        //从arr数组开始遍历,去找是否存在存在该对 夫妻/伴侣ID
        //若存在,则去除
        for (int i=0;i<arr.length;i++){
            if (ss.contains(arr[i][0])&&ss.contains(arr[i][1])){
                ss=ss.replace(arr[i][0],"");
                ss=ss.replace(arr[i][1],"");
            }
        }
        String o="\\s+";//作为正则表达式: 表示一个或若干个空格
        arr1=ss.split(o);
        Arrays.sort(arr1);//进行排序
        boolean b=true;
        System.out.println(arr1.length);
        for (int i=0;i<arr1.length;i++){
            if (b){
                System.out.print(arr1[i]);
                b=false;
            }else {
                System.out.print(" "+arr1[i]);
            }
        }
    }
}

2、电话聊天狂人

1)、题目

给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。

输入格式:

输入首先给出正整数N(≤105),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。

输出格式:

在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

输出样例:

13588625832 3

2)代码解读

题目给我们n对通话记录的号码,要求我们找出通话最多的通话狂人,输出其号码和通话次数,要是有多个通话次数的通话狂人,就输出最小的号码和通话次数以及有多少个和他通话次数相同的人。我们可以使用HashMap储存,再进行排序,这道题就会变得非常简单。

3)代码

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n= Integer.parseInt(sc.nextLine());
        HashMap<String,Integer> map=new HashMap<>();
        //输入
        for (int i=0;i<n;i++){
            String s=sc.nextLine();
            String[] ss=s.split(" ");
            if (!map.containsKey(ss[0])){
                map.put(ss[0],1);
            }else {
                map.put(ss[0],map.get(ss[0])+1);
            }
            if (!map.containsKey(ss[1])){
                map.put(ss[1],1);
            }else {
                map.put(ss[1],map.get(ss[1])+1);
            }
        }
        //将map的entrySet放入list集合
        List<Map.Entry<String,Integer>> list = new ArrayList<>(map.entrySet());
        //使用lambda表达式进行比较器传递
        //先比较该电话的拨打次数是否相同,降序排列
        //再比较电话号码打大小,降序排列
        list.sort((o1, o2) -> {
            if (o1.getValue().equals(o2.getValue())) {
                return o2.getKey().compareTo(o1.getKey());
            } else//重写排序规则,小于0表示升序,大于0表示降序
                return o2.getValue() - o1.getValue(); 
        });
        int count=0;//保存拨打号码次数相同的数量
        int v=0;
        //第一次遍历无法比较,所有设置一个boolean判断区分
        boolean b=true;
        //区别一种特殊情况:是否全部号码拨打次数都一样
        boolean bb=true;
        String ss = null;
        //使用Iterator遍历list去找号码
        Iterator<Map.Entry<String, Integer>> inter = list.iterator();
        while(inter.hasNext()){
            Map.Entry<String, Integer> item = inter.next();
            String key = item.getKey();
            int value = item.getValue();
            if (b){
                ss=key;
                v=value;
                count++;
                b=false;
            }else {
            //发现这个号码次数和上一个号码次数不同,即是最小号码
            //或者是次数最大的号码,然后再进行if判断 
                if (v!=value){
                    bb=false;
                    System.out.print(ss+" ");
                    if (count==1){
                        System.out.print(v);
                    }else {
                        System.out.print(count);
                    }
                    break;
                }
                ss=key;
                count++;
            }
        }
        //如果全部号码拨打次数相同,则输出
        if (bb){
            System.out.println(ss+" "+v+" "+map.size());
        }
    }
}
目录
相关文章
电话聊天狂人
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
185 0
|
算法
数据结构与算法题目集(中文) - 7-14 电话聊天狂人(25 分)
数据结构与算法题目集(中文) - 7-14 电话聊天狂人(25 分)
183 0
|
数据库
情人节礼物:毒一无二的维多利亚内衣
情人节就要来了,就如往常一般,垃圾邮件发送者必然会大肆宣扬他们的恶意活动。进入这个所谓“爱的月份” 才刚开始,笔者就已经看到至少两种垃圾邮件,随人们涌入推销礼品的网站来为心爱的人挑选礼物的这个特殊日子。
1276 0
|
安全 前端开发 程序员
程序员把电脑病毒当宠物养!网友:要不要这么可爱?
提起电脑病毒四个字,大家第一时间就会想到熊猫烧香,木马等等吧。很多电脑病毒破坏力惊人,熊猫烧香在当年也是让全国人民都陷入一种恐慌状态。但对于我们程序员来说,看过的病毒跟吃的米一样多,哈哈,有点夸张。
1339 0
|
算法
不开玩笑,阿里人真的靠脸吃饭了
这阵子,阿里的程序猿们倒腾完自己家的商店又倒腾了食堂,没人管的餐厅靠脸吃饭,感受一下~
3362 0
1分钟掌握和女生约会的聊天方式
初次约会中最重要的一环是什么?不是你带妹子去了哪家高档餐厅、也不是你对妹子有多好,而是聊天。
1237 0
下一篇
无影云桌面