LOADING

百度&必应权4, 日IP1w+ 查看详情
自助收录

2023年华为OD机考真题:垃圾信息拦截

算法刷题2年前 (2023)更新 江南白衣
670 0 0
2023年华为OD机考真题:垃圾信息拦截

全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。

真题库:https://www.yuque.com/codernav.com/od

题目:垃圾信息拦截
知识点图
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
大众对垃圾短信深恶痛绝,希望能对垃圾短信发送者进行识别,为此,很多软件增加了垃圾短信识别机制。经分析,发现正常用户的短信通常具备交互性,而垃圾短信往往都是大量单向的短信,按照如下规则进行垃圾短信识别:
本题中,发送者A符合以下条件之一的,则认为A是垃圾短信发送者:
* A发送短信的接收者中,没有发过短信给A的人数L > 5;
* A发送的短信数 - A接收的短信数M > 10;
* 如果存在X,A发送给X的短信数-A接收到X的短信数N > 5;
输入描述:
第一行为条目数目,接下来几行是具体的条目,每个条目,是一对ID,第一个数字是发送者ID,后面的数字是接收者ID,中间空格隔开,所有的ID都为无符号整型,ID最大值为100;
同一个条目中,两个ID不会相同(即不会自己给自己发消息)
最后一行为指定的ID
输出描述:
输出该ID是否为垃圾短信发送者,并且按序列输出 L M的值(由于N值不唯一,不需要输出);
输出均为字符串。
示例1
输入:
15
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
14 1
1 15
1
输出:
true 13 13
说明:
true表示1是垃圾短信发送者,两个数字,代表发送者1对应的L和M值。true 13 13中间以一个空格分割。注意true是字符串输出
示例2
输入:
15
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
14 1
1 15
2
输出:
false 0 -1
解题思路:
本题主要是逻辑题,不是很难。需要注意的就是使用map对象来记录A发送给X的短信数和A接收到X的短信数N。

代码实现一:

package com.codernav.demo.hwod.exam;

import java.util.*;

/**
 * @title 垃圾信息拦截
 * @Description 大众对垃圾短信深恶痛绝,希望能对垃圾短信发送者进行识别,为此,很多软件增加了垃圾短信识别机制。经分析,发现正常用户的短信通常具备交互性,而垃圾短信往往都是大量单向的短信,按照如下规则进行垃圾短信识别:
 * 本题中,发送者A符合以下条件之一的,则认为A是垃圾短信发送者:
 * * A发送短信的接收者中,没有发过短信给A的人数L > 5;
 * * A发送的短信数 - A接收的短信数M > 10;
 * * 如果存在X,A发送给X的短信数-A接收到X的短信数N > 5;
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/28
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        List<int[]> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int idFrom = sc.nextInt();
            int idTo = sc.nextInt();
            list.add(new int[]{idFrom, idTo});
        }
        int id = sc.nextInt();      //A的ID
        Set<Integer> sendMailPersons = new HashSet<>();   //接收A短信的人集合
        Set<Integer> getMailPersons = new HashSet<>();   //发送短信给A的人集合
        Map<Integer, Integer> sendMail = new HashMap<>();       //A发送短信给X的数量
        Map<Integer, Integer> getMail = new HashMap<>();     //A接收X短信的数量
        int sendMailsNum = 0;   //A发送的短信数量
        int getMailsNum = 0;    //A接收的短信数量
        for (int[] ints : list) {
            if (ints[0] == id) {      //发送者是A
                sendMailPersons.add(ints[1]);
                sendMailsNum++;
                sendMail.put(ints[1], sendMail.getOrDefault(ints[1], 0) + 1);
            } else if (ints[1] == id) {    //接受者是A
                getMailsNum++;
                getMailPersons.add(ints[0]);
                getMail.put(ints[0], getMail.getOrDefault(ints[0], 0) + 1);
            }
        }

        boolean isLaji = false;
        sendMailPersons.removeAll(getMailPersons);      //接收A短信的人的集合剔除发送短信给A的人集合
        int L = sendMailPersons.size();
        int M = sendMailsNum - getMailsNum;
        if (L > 5) {
            isLaji = true;
        } else if (M > 10) {
            isLaji = true;
        } else {
            for (Map.Entry<Integer, Integer> map : sendMail.entrySet()) {
                int getId = map.getKey();
                int send = map.getValue();
                if (getMail.containsKey(getId)) {
                    if (send - getMail.get(getId) > 5) {
                        isLaji = true;
                        break;
                    }
                }
            }
        }
        System.out.println(isLaji + " " + L + " " + M);
    }
}

代码实现二:Java代码满分实现

package com.codernav.demo.hwod.exam;

import java.util.Scanner;

/**
 * @title 垃圾信息拦截
 * @Description 大众对垃圾短信深恶痛绝,希望能对垃圾短信发送者进行识别,为此,很多软件增加了垃圾短信识别机制。经分析,发现正常用户的短信通常具备交互性,而垃圾短信往往都是大量单向的短信,按照如下规则进行垃圾短信识别:
 * 本题中,发送者A符合以下条件之一的,则认为A是垃圾短信发送者:
 * * A发送短信的接收者中,没有发过短信给A的人数L > 5;
 * * A发送的短信数 - A接收的短信数M > 10;
 * * 如果存在X,A发送给X的短信数-A接收到X的短信数N > 5;
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/28
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] data = new int[100][100];
        for (int i = 0; i < n; i++) {
            int from = in.nextInt();
            int to = in.nextInt();
            data[from][to]++;
        }
        int id = in.nextInt();
        int l = 0;
        int m1 = 0;
        int m2 = 0;
        boolean res = false;
        for (int i = 0; i < 100; i++) {
            if (data[id][i] > 0 && data[i][id] == 0) {
                l++;
            }
            m1 += data[id][i];
            m2 += data[i][id];
            if (data[id][i] - data[i][id] > 5) {
                res = true;
            }
        }
        if (l > 5 || m1 - m2 > 10) {
            res = true;
        }
        System.out.print(res + " " + l + " " + (m1 - m2));
    }
}

 

© 版权声明
开发者导航

相关文章

开发者导航

暂无评论

暂无评论...