华为OD机试【垃圾信息拦截】(java)(100分)

本文介绍了一种基于用户短信交互性和发送/接收短信数量的规则,用于识别垃圾短信发送者的算法。通过统计发送者与接收者的关系,以及满足特定条件(如接收者未发短信给发送者人数多于5,或发送量大于接收量10),判断用户是否为垃圾短信发送者。
摘要由CSDN通过智能技术生成

1、题目描述

大众对垃圾短信深恶痛绝,希望能对垃圾短信发送者进行识别,为此,很多软件增加 了垃圾短信识别机制。经分析,发现正常用户的短信通常具备交互性,而垃圾短信往 往都是大量单向的短信,按照如下规则进行垃圾短信识别:
本题中,发送者A符合以下条件之一的,则认为A是垃圾短信发送者:
① A 发送短信的接收者中,没有发过短信给A的人数 L > 5;
② A 发送的短信数 - A接收的短信数 M > 10;
③ 如果存在 X,A 发送给 X 的短信数 - A 接收到X的短信数N > 5。

2、输入描述

第一行为条目数目,接下来几行是具体的条目,每个条目,是一对ID,第一个数字是发送者ID,后面的数字是接收者ID,中间空格隔开,所有的ID都为无符号整型,ID最大值为100;
同一个条目中,两个ID不会相同(即不会自己给自己发消息);
最后一行为指定的ID。

3、输出描述

输出该ID是否为垃圾短信发送者(是输出 true,否则输出 false),并且按序列输出L、M的值(由于N值不唯一,不需要输出);
输出均为宇符串。
用例:

输入
8
1 2
1 3
1 4
1 5
1 6
6 1
5 2
6 3
1

输出
false 4 1

温馨提示!!!
华为OD机试考试官方会对考生代码查重。华为od机试因为有题库所以有很大的概率抽到原题。如果碰到了题库中的原题,千万不要直接使用题解中的代码,一定要做些修改,比如代码中的变量名,除此之外,代码的组织结构和逻辑也要进行一些改变,所以在日常的刷题中,要提前编写好属于自己的代码。

4、题解

本题简单,使用map存储发送者接受者之间的关系,其他的根据题目中的条件判断即可,直接看代码。
代码如下:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int nums = Integer.parseInt(sc.nextLine());
    String[] arr = new String[nums];

    for (int i=0; i<nums; i++) {
        arr[i] = sc.nextLine();
    }
    // 目标发送短信 a
    int a = Integer.parseInt(sc.nextLine());

    Map<Integer, List<Integer>> maps = new HashMap<>();
    for (String str : arr) {
        int[] tmp = Arrays.stream(str.split(" ")).mapToInt(Integer::parseInt).toArray();
        List<Integer> tmpList = maps.getOrDefault(tmp[0], new ArrayList<>());
        tmpList.add(tmp[1]);
        maps.put(tmp[0], tmpList);
    }
    // 是否垃圾短信发送者
    boolean flag = false;
    // 没发过短信给a的人数
    int L = 0;
    // a接收的短信数
    int M = 0;
    // a发送给X的短信数
    int X = 0;
    //  a接收到X的短信数
    int N = 0;
    List<Integer> aList = maps.get(a);
    for (Integer item : aList) {
        List<Integer> tmpList = maps.getOrDefault(item, new ArrayList<>());
        if (!tmpList.contains(a)) {
            L++;
        }else {
            M++;
            if (!flag) {
                X = Collections.frequency(aList, item);
                N = Collections.frequency(tmpList, a);
                if (X - N > 5) {
                    flag = true;
                }
            }
        }
    }

    int atoNum = aList.size();
    if (flag || L > 5 || atoNum - M > 10) {
        System.out.println("true " + L + " " + M);
    } else {
        System.out.println("false " + L + " " + M);
    }
}

执行结果如下:
在这里插入图片描述

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖小夫子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值