字节跳动——用户喜好编程题

这题刚开始的思路是在每个区间进行查找,这样最坏的情况下的时间复杂度是n*q(超时),第二个思路是将用户喜好相同的用户放在一个list中进行遍历,这样最坏的情况的时间复杂度是n

 1 import java.util.*;
 2 
 3 /*
 4         为了不断优化推荐效果,今日头条每天要存储和处理海量数据。
 5         假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,
 6         我们会想知道某一段时间内注册的用户
 7         (标号相连的一批用户)中,有多少用户对这类文章喜好值为k。
 8         因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1)。
 9         输入描述:
10         输入: 第1行为n代表用户的个数 第2行为n个整数,第i个代表用户标号为i的用户对某类文章的喜好度
11          第3行为一个正整数q代表查询的组数
12          第4行到第(3+q)行,每行包含3个整数l,r,k代表一组查询,即标号为l<=i<=r的用户中对这类文章喜好值为k的用户的个数。
13          数据范围n <= 300000,q<=300000 k是整型
14 
15         输出描述:
16         输出:一共q行,每行一个整数代表喜好值为k的用户的个数
17         示例1
18         输入
19         5
20         1 2 3 3 5
21         3
22         1 2 1
23         2 4 5
24         3 5 3
25         输出
26         1
27         0
28         2
29         说明
30         样例解释:
31         有5个用户,喜好值为分别为1、2、3、3、5,
32         第一组询问对于标号[1,2]的用户喜好值为1的用户的个数是1
33         第二组询问对于标号[2,4]的用户喜好值为5的用户的个数是0
34         第三组询问对于标号[3,5]的用户喜好值为3的用户的个数是2*/
35 /*喜好值作为key值,用户编号作为value*/
36 public class ZJYHXH2 {
37     public static void main(String[] args) {
38         Scanner scanner = new Scanner(System.in);
39         int n = scanner.nextInt();
40         int [] arr = new int[n];
41         for(int i = 0; i < n; i++){
42             arr[i] = scanner.nextInt();
43         }
44         HashMap<Integer, List<Integer>> map = new HashMap<>();
45         for(int i = 0; i < n; i++){
46             int key = arr[i];
47             int value = i + 1;
48             if(!map.containsKey(key)){
49                 List<Integer> list = new LinkedList<>();
50                 list.add(value);
51                 map.put(key,list);
52             }else{
53                 map.get(key).add(value);
54             }
55         }
56         int m = scanner.nextInt();
57         Queue<Integer> queue = new LinkedList<>();
58         for(int i = 0; i < m; i++){
59             int l = scanner.nextInt();
60             int r = scanner.nextInt();
61             int k = scanner.nextInt();
62             List<Integer> list = map.get(k);
63             int sum = 0;
64             if(list != null){
65                 for(Integer val:list){
66                     if(val >= l && val <= r){
67                         sum++;
68                     }
69                 }
70             }
71             queue.add(sum);
72         }
73         for(Integer ans : queue){
74             System.out.println(ans);
75         }
76     }
77 }

 

posted @ 2020-09-05 11:19  雨下_整夜  阅读(366)  评论(0编辑  收藏  举报