首页 > 试题广场 >

用户喜好

[编程题]用户喜好
  • 热度指数:1820 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

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

输出

1
0
2

说明

样例解释:
有5个用户,喜好值为分别为1、2、3、3、5,
第一组询问对于标号[1,2]的用户喜好值为1的用户的个数是1
第二组询问对于标号[2,4]的用户喜好值为5的用户的个数是0
第三组询问对于标号[3,5]的用户喜好值为3的用户的个数是2 
  public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);  int peoplenum = sc.nextInt();  Map<Integer, List<Integer>> map = new HashMap<>();  /**  * 输入的时候会出现不同的用户数会出现相同的关注度  * 所以map这样可以自动分出不同关注度分别又多少关注度  */  for (int i = 1; i <= peoplenum; i++) { int guanzhudu = sc.nextInt();  if (!map.containsKey(guanzhudu)) {
                List<Integer> list = new ArrayList<>();  list.add(i);  map.put(guanzhudu, list);  } else {
                List<Integer> list = map.get(guanzhudu);  list.add(i);  }

        } int num = sc.nextInt();//查询组数 //        List<chaxun> list=new ArrayList<>(); //        for (int i=0;i<num;i++){ //            list.add(new chaxun(sc.nextInt(),sc.nextInt(),sc.nextInt())); //        } //        for (int i=0;i<num;i++){ //            int c=Fun(list,i,map); //            System.out.println(c); //        }  /**  * 定义一个查找关注度的循环  * 找到要查找关注度的哪个小组  * 小组中的用户大小要与输入的匹配  */  for (int i = 0; i < num; i++) { int a = sc.nextInt();  int b = sc.nextInt();  int key = sc.nextInt();  int sum = 0;  List<Integer> list = map.get(key);  if (list!=null){ for (int k = 0; k < list.size(); k++) { if (list.get(k) >= a && list.get(k) <= b) {
                        sum += 1;  }
                }
            }
            System.out.println(sum);   }

    }
发表于 2019-10-21 21:26:53 回复(1)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        Map<Integer,ArrayList<Integer>> perfer=new HashMap<>();
        for(int i=1;i<n+1;i++){
            int per=in.nextInt();
            if(perfer.containsKey(per)){
                ArrayList<Integer> list=perfer.get(per);
                list.add(i);
            }
            else{
                ArrayList<Integer> list=new ArrayList<>();
                list.add(i);
                perfer.put(per,list);
            }
        }
        int sel=in.nextInt();
        for(int i=0;i<sel;i++){
            int count=0;
            int start=in.nextInt();
            int stop=in.nextInt();
            int per=in.nextInt();
            if(perfer.containsKey(per)){
                ArrayList<Integer> li=perfer.get(per);
                Iterator<Integer> ltr=li.iterator();
                while(ltr.hasNext()){
                    int num=ltr.next();
                    if(num>=start&&num<=stop){
                        count++;
                    }
                }
            }
            System.out.println(count);
        }
    }
}
改进二楼的代码,遍历列表还是用迭代器效率高
感谢二楼
发表于 2019-03-15 09:56:57 回复(0)