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);
}
}
执行结果如下: