005字节跳动面试题之用户喜好

444 阅读2分钟

题目: 为了不断优化推荐效果,今日头条每天要存储和处理海量数据。假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为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]);
        }
    }
}