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:
1
0
2
例子说明1:
样例解释:
有5个用户,喜好值为分别为1、2、3、3、5,
第一组询问对于标号[1,2]的用户喜好值为1的用户的个数是1
第二组询问对于标号[2,4]的用户喜好值为5的用户的个数是0
第三组询问对于标号[3,5]的用户喜好值为3的用户的个数是2

解答:

import java.util.*;
public class Main{
  public static void main(String[] args) throws Exception{
    int num;
    Scanner sc = new Scanner(System.in);
    num=sc.nextInt();  //n个用户
    int[] arr= new int[num];
    for(int i=0;i<num;i++)
      arr[i]=sc.nextInt();  //用户的喜好值
    int leng= sc.nextInt();  //查询组数
    int[] lrk= new int[3];    
    for(int i=0;i<leng;i++){
      int temp=0;
      for(int j=0;j<3;j++)
        lrk[j]=sc.nextInt();  //l,r,k
      for(int j=lrk[0]-1;j<lrk[1];j++){  //在l<=j<=r中,依次查找值为k的
        if(arr[j]==lrk[2])
          temp=temp+1;
      }
      System.out.println(temp);
    }
  }
}

运行结果:

运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大
case通过率为50.00%

然后呢,我就想到可能是代码的

for(int j=lrk[0]-1;j<lrk[1];j++){  //在i<=j<=r中,依次查找值为k的
  if(arr[j]==lrk[2])
    temp=temp+1;
}

运行时间过长了,然后试了改成二分查找。

import java.util.*;
public class Main{
  public static void main(String[] args) throws Exception{
    int num;
    Scanner sc = new Scanner(System.in);
    num=sc.nextInt();
    int[] arr= new int[num];
    for(int i=0;i<num;i++)
      arr[i]=sc.nextInt();
    int leng= sc.nextInt();
    int[] lrk= new int[3];
    for(int i=0;i<leng;i++){
      int temp=0,left=0,right=0,mid=0,target=0;
      for(int j=0;j<3;j++)
        lrk[j]=sc.nextInt();
      left=lrk[0]-1;
      right=lrk[1]-1;
      target=lrk[2];
      int[] sonarr = new int[right-left+1];
      for(int j=0;j<right-left+1;j++)
        sonarr[j]=arr[left+j];
      Arrays.sort(sonarr);     //对l-r间的数据排序,后续进行二分查找,若对整个arr排序,则是错误的,因为喜好值对应的人的id变了,对在[l,r]间数据排序则无影响,因为k值在这里面查找,顺序无影响
      right=right-left;
      left=0;
      while(sonarr[left]<target&&sonarr[right]>target){
        mid=(left+right)/2;
        if(sonarr[left+1]==target||sonarr[right-1]==target)
          break;
        else if(sonarr[mid]<target)
          left=mid;
        else if(sonarr[mid]>target)
          right=mid;
      }
      for(int j=left;j<=right;j++){
        if(sonarr[j]==target)
          temp=temp+1;
      }
      System.out.println(temp);
    }
  }
}

结果程序通过率为0.00%,(┬_┬)

啊,做了一个小时心态崩了,没办法,看看别人的吧.....看了一遍大佬的思路,然后自己又做了一遍..

思路就是,把喜好值(key)相同的人放在一个value里,比如(1,3,3,5,6,6,6),那么喜好值(key)为3的人有2,3,所以map里存放的数据为{(1,“1”),(3,“2,3”),(5,“4”),(6,“5,6,7”)}

然后通过k=key的方式,依次读取value中的值是否是  l<=value(i)<=r,若是,则temp+1。若没找到这个key,那么那么输出temp=0。

import java.util.*;
public class Main{
  public static void main(String[] args) throws Exception{
    Scanner in =new Scanner(System.in);
    int peo= in.nextInt();
    int[] arr = new int[peo];
    for(int i=0;i<peo;i++)
      arr[i]=in.nextInt();
    Map<Integer,ArrayList<Integer>> map = new HashMap();
    ArrayList<Integer> list;
    for(int i=0;i<peo;i++){
      int key=arr[i];
      int value=i+1;
      list = new ArrayList<Integer>();
      if(map.containsKey(key)){
        list=map.get(key);
        list.add(value);
      }else {
        list.add(value);
        map.put(key,list);
      }
    }
    int num=in.nextInt();
    for(int i=0;i<num;i++){
      int temp=0;
      int l=in.nextInt();
      int r=in.nextInt();
      int k=in.nextInt();
      list = new ArrayList<Integer>();
      if(!map.containsKey(k))
        System.out.println(temp);
      else{
        list=map.get(k);
        for(int x:list){
          if(l<=x&&x<=r)
          temp=temp+1;
        }
        System.out.println(temp);
      }
   }
  }
}

ACCEPT!!

原文地址:https://www.cnblogs.com/zhuii/p/9951437.html

时间: 2024-10-07 10:34:53

2018秋招校招后端方向(第二批)的相关文章

2018秋招小红书算法方向在线编程题

代码如下: class TreeNode: def __init__(self, x): self.left=None self.right=None self.value=x def BuildTree(ceng, zhong): if len(ceng)==0: return None if len(ceng)==1: return TreeNode(ceng[0]) else: flag=TreeNode(ceng[0]) root=ceng[0] zong=zhong[:zhong.in

网易秋招校招编程题

网易内推面试凉了,再战正式批笔试,选择和简答略难,编程题很良心,基本就是模拟.找规律,略加思考就能解出来的题目,本弱鸡只有在良心网易笔试才能AK. 1.翻转翻转 这题一开始没思路,ac了后两题后再回来思考,发现只需要判断某个位置周围有几个点,就代表了那个位置会被别的点翻转几次,那么如何求周围有几个点呢? 简单的把位置分成3类: 一类是四个顶点:每个顶点会被翻转4次(加上自己翻转一次). 第二类是四条边(不含顶点):边上的点会被翻转6次. 第三类就是中间部分:中间的每个点会被翻转9次. 因此翻转9

京东2018秋招c++岗 神奇数

题意大概是: 一个数比如242,把所有数字分成两组,而且两组的和相等,那么这个数就是神奇数,此时242,能够分成{2,2}和{4},所以242是神奇数. 题目要求输入n和m求[n,m]区间内神奇数的个数. 思路: 对于任意一个数字,将每一位上的数字保存到数组里,并求所有位上的数字的和sum.然后使用回溯法遍历数组, 查看数组内是否存在和为sum/2的情况,如果存在则为神奇数. bool isfind(vector<int>& nums, int sum, int cur, int be

2018秋招面试题

https://blog.csdn.net/bntX2jSQfEHy7/article/details/81187626 各大企业面试题: https://blog.csdn.net/huangshulang1234/article/details/79102943 一.阿里巴巴面试 第一个:阿里面试都问什么? :(55分钟) 01 1.开发中Java用了比较多的数据结构有哪些?2.谈谈你对HashMap的理解,底层原理的基本实现,HashMap怎么解决碰撞问题的?这些数据结构中是线程安全的吗?

2018秋招数据库笔试面试题汇总

基础概念 1. 什么是数据库事务?事务有什么特点? 数据库事务:是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单元. 事务特点: 原子性 一致性 隔离性 持久性特 2. 主键和外键的区别? 主键所在的列的值是唯一的,不可为空的 外键所在的列的值可以重复,可以为空的,不能创建对应表中不存在的外键值 3. truncate与delete的区别? 比较 truncate delete 相同点 删除表中的全部行 不带where字句删除表中的全部行 相同点 删

腾讯 2018 秋招精选(50 题)

AC # 题名 难度   2 两数相加  中等   4 两个排序数组的中位数  困难   5 最长回文子串  中等   7 反转整数  简单   8 字符串转整数  中等   9 回文数   简单   11 盛最多水的容器  中等   14 最长公共前缀  简单   15 三数之和   中等   16 最接近的三数之和  中等   20 有效的括号  简单   21 合并两个有序链表  简单   23 合并k个有链表  困难   26 删除排序数组中的重复项   简单   33 搜索旋转排序数组

头条笔试题2018后端第二批

头条笔试题2018后端第二批 标签(空格分隔): 笔试题 描述:为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k.因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1). 输入描述: 输入: 第1行为n代表用户的个数 第2行为n个整数,

2018某二本的秋招流水帐

本文地址:http://www.cnblogs.com/maplefighting/p/7906789.html 某二本财经类弱校,acm省赛拿了两次银,icpc,ccpc打了两年铁,无实习.目标:互联网公司 大二三主要刷电影,看小说,玩acm以及搞绩点 (至今也不清楚绩点除了拿点学校的钱之外还有什么用,拿过二等奖学金等) 大三第二学期被队友拖出去打多一次省赛,所以准备了下,就没春招,想想还是很亏啊!! 后面觉得再不学习真的会找不到工作的,所以五六月就开始看书了.大概看了四个月吧,断断续续的 面

【2015年奇虎360|绿盟科技|唯品会|4399秋招岗位分析及内推】一大波网络|安全|运维岗位来袭~

2015年华为网申截止提醒 ①华为的网申页面:http://career.huawei.com/recruitment/campus.html,之前说明是9月3号截止网申,这两天上去看,发布时间又更新为9月1号,不管怎样,建议大家还是先投递吧.按照拼客科技这边的经验(内部已经有3枚学员入职华为),我们前两年投递的岗位是:技术服务工程师和销售解决方案经理,都是大家学习网络和安全这块的,比较匹配的岗位. ②今年主要是技术服务工程师.网络安全工程师,如果打算走销售方向,也可以投递他们的营销工程师.产品