头条笔试题2018后端第二批-用户喜好

时间:2022-02-15 03:47:14

头条笔试题2018后端第二批

标签(空格分隔): 笔试题


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

package 校招.头条.后端第二批.用户喜好;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * @Author: Lance
 * @Date: 2018/8/20 16:50
 */
public class Main
{
    public static void main(String[] args)
    {

        Scanner scanner = new Scanner(System.in);

        int num = scanner.nextInt();
        int[] hubby = new int[num];

        ArrayList<int[]> arrayList = new ArrayList<>();

        for (int i = 0; i < num; i++)
        {
            hubby[i] = scanner.nextInt();
        }

        //扫描输入查询的组数
        int zuNum = scanner.nextInt();


        while (zuNum > 0)
        {
            int[] lrk = new int[3];

            for (int i = 0; i < 3; i++)
            {
                lrk[i] = scanner.nextInt();
            }

            arrayList.add(lrk);
            zuNum--;
        }

        for (int[] temp : arrayList)
        {
            function(hubby,temp);
        }


    }


    public static void function(int[] hubby, int[] lrk)
    {
        //定义当前范围内喜欢的人数
        int curNum = 0;
        for (int i = lrk[0] - 1; i <= lrk[1] - 1; i++)
        {
            if (hubby[i] == lrk[2])
            {
                curNum++;
            }
        }

        System.out.println(curNum);
    }


}