zoukankan      html  css  js  c++  java
  • 字节跳动——用户喜好编程题

    这题刚开始的思路是在每个区间进行查找,这样最坏的情况下的时间复杂度是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 }
  • 相关阅读:
    Hibernate系列教材 (十六)- 各类概念
    Hibernate系列教材 (十五)- 各类概念
    Hibernate系列教材 (十四)- 各类概念
    Hibernate系列教材 (十三)- 各类概念
    Hibernate系列教材 (十二)- 关系
    Hibernate系列教材 (十一)- 关系
    Hibernate系列教材 (十)- 关系
    codeforces1509 C. The Sports Festival (区间DP)
    洛谷P3194 [HNOI2008]水平可见直线(计算几何+单调栈)
    CF1265E Beautiful Mirrors (概率dp)
  • 原文地址:https://www.cnblogs.com/yu-xia-zheng-ye/p/13617562.html
Copyright © 2011-2022 走看看