Fork me on GitHub

字节跳动2018 Android校招编程题——用户喜好

题目

用户喜好

为了不断优化推荐效果,今日头条每天要存储和处理海量数据。假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k。因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1)。

输入描述:

1
输入: 第1行为n代表用户的个数 第2行为n个整数,第i个代表用户标号为i的用户对某类文章的喜好度 第3行为一个正整数q代表查询的组数  第4行到第(3+q)行,每行包含3个整数l,r,k代表一组查询,即标号为l<=i<=r的用户中对这类文章喜好值为k的用户的个数。 数据范围n <= 300000,q<=300000 k是整型

输出描述:

1
输出:一共q行,每行一个整数代表喜好值为k的用户的个数

输入例子1:

1
2
3
4
5
6
5
1 2 3 3 5
3
1 2 1
2 4 5
3 5 3

输出例子1:

1
2
3
1
0
2

例子说明1:

1
2
3
4
5
样例解释:
有5个用户,喜好值为分别为1、2、3、3、5,
第一组询问对于标号[1,2]的用户喜好值为1的用户的个数是1
第二组询问对于标号[2,4]的用户喜好值为5的用户的个数是0
第三组询问对于标号[3,5]的用户喜好值为3的用户的个数是2

解题方法

首先用hashMap记录每个喜好值对应的用户id,将用户id记录在一个list中,然后查询目标喜好值的list,记录list中满足条件的id个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();//总人数
HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();
//记录所有喜好值对应用户的id保存到map中,用户id保存到ArrayList中
for (int i = 0; i < n; i++) {
int cur = scanner.nextInt();
ArrayList<Integer> list = map.getOrDefault(cur, new ArrayList<>());
list.add(i);
map.put(cur, list);
}
int times = scanner.nextInt();//记录查询次数
for (int i = 0; i < times; i++) {
int count = 0;//记录用户个数
int start = scanner.nextInt();
int end = scanner.nextInt();
int target = scanner.nextInt();
ArrayList<Integer> list = map.get(target);
if (list == null) {
System.out.println(0);
} else {
for (int a :
list) {
if (a + 1 >= start && a + 1 <= end) {//用户id在区间内
count++;
}
}
System.out.println(count);
}
}
}
}
BJTU-HXS wechat
海内存知己,天涯若比邻。