题目: 为了不断优化推荐效果,今日头条每天要存储和处理海量数据。假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k。因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1)。
输入描述:
输入: 第1行为n代表用户的个数 第2行为n个整数,第i个代表用户标号为i的用户对某类文章的喜好度
第3行为一个正整数q代表查询的组数 第4行到第(3+q)行,每行包含3个整数l,r,k代表一组查询,即标号为l<=i<=r的用户中对这类文章喜好值为k的用户的个数。
数据范围n <= 300000,q<=300000 k是整型
输出描述:
输出:一共q行,每行一个整数代表喜好值为k的用户的个数
输入例子1:
5 有5个用户,喜好值为分别为1、2、3、3、5,
1 2 3 3 5 一号用户喜欢值为1,二号用户喜欢值为2,三号用户喜欢值为3,四号用户喜欢值为3,五号用户喜欢值为5
3 组数
1 2 1 对于用户下标1~2的区间 喜好值为1 要求求出用户的数量
2 4 5 对于用户下标2~4的区间 喜好值为5
3 5 3 对于用户下标3~5的区间 喜好值为3
输出例子1:
1 对于用户1~2之间 喜好值为1 的用户数量为1
0 对于用户2~4之间 喜好值为5 的用户数量为0
2 对于用户3~5之间 喜好值为3 的用户数量为2
思路:使用map映射key为喜好值,value为此喜好的用户 (因为喜好值数量相对较少)
根据喜好值查找 使用l,r指针指向边界看数组区间中有几个 元素的大小为* 代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int userCount = sc.nextInt();//用户的人数
// int[] userLike = new int[userCount+1]; //用户喜好数组,小标为用户【下标从1开始】,值为喜欢值
Map<Integer,List<Integer>> map = new HashMap();//key为喜好值, value为是此喜好值得用户
for (int i = 1; i <= userCount; i++) {
int like = sc.nextInt(); //此用户的喜好值
if (map.containsKey(like)) {
map.get(like).add(i);//此喜好值存在,则把喜好值对应的用户list加上此用户
} else {
List<Integer> li = new ArrayList();
li.add(i); //用户列表
map.put(like,li);
}
}
int zuCount = sc.nextInt();
int[] results = new int[zuCount]; //结果集 ,下标为第几组
for (int i = 0; i < zuCount; i++) {
int l = sc.nextInt();//左边界
int r = sc.nextInt();//右边界
int target = sc.nextInt();//目标值
if (map.containsKey(target)) {
for (Integer in : map.get(target)) {
if (in >= l && in <= r) {
results[i]++;
}
}
}
}
for (int i = 0; i < zuCount; i++) { //输出结果集
System.out.println(results[i]);
}
}
}