天天看点

字节跳动2020-ByteCamp暑期夏令营研发组习题

概要

本文主要是记录字节2020夏令营的笔试习题,解答部分待日后不断完善。

选择题部分记录不是很完全,剩下没有被收录的大都偏容易。

单项选择题

  1. 箱子里有20个红球,18个白球,逐一随机抽取球,问整个过程中箱外白球至少有一次和箱外红球相等的概率。
  2. 求f(x)=x-sinx的零点个数

多项选择题

  1. 假设在单核无超线程CPU场景下执行如下代码「x=x+1,y=y+x」,有三个线程分别执行这段代码,在所有线程开始前,假设有2个变量x,y,x和y都被初始化为1,x和y值会且只会被这三个线程修改,线程随时会被抢占,设该代码均为原子的,则可能得到的结果?

填空题

  1. 有一台机器,可批量输入单词,会返回其翻译值,但是不知道对应关系,现有1000个单词,问最少需要()次才可以确定它们的翻译。
  2. 幼儿园阿姨买了很多糖果,让6位小朋友早上自己分糖果,第一个先分成相等6堆,结果发现多出来1颗,于是他吃了一颗然后拿走一堆,剩下五堆;第二个小朋友把五堆合在一起,又分了6堆,结果发现又多了一个,于是他也吃了一颗拿走一堆,剩下的亦如此。问阿姨至少买了多少颗糖。

编程题

  1. 题目描述:

    小包有一个纪念日,他特别喜欢这个日子,于是把它以"DD-MM-YYYY" (如:31-01-2020,代表2020年1月31日) 的格式记录了下来。但小包不想被别人知道这个日子,于是他将这个日子与很多别的日子写在一起,且该日子的出现次数最多。

    小包不小心忘记了纪念日到底是哪天,所以小包现在需要从之前的记录中找到这个纪念日。

    输入描述:

    一行一个字符串,其中只包含数字和字符"-",字符串长度不超过10^5。

    2001 <= YYYY <= 2020

    01<=MM<=12

    DD满足每个月份的日期数,需要考虑闰年的2月

    MM和DD不够两位数时会填充前导0,如2020年1月1日会写成01-01-2020而不是1-1-2020。

    输入保证一定存在一个符合要求的合法的日期,且保证一定存在一个日期出现次数严格大于别的日期出现次数。

    输出描述:

    纪念日日期,以DD- MM-YYYY"的格式。

    示例1:

    输入:20-12-2030-12-2020

    输出:30-12-2020

    说明:符合条件的日期只有30-12-2020这一个。注意数据中的20-12-2030年份超出了2001 <= YYYY <= 2020范围,因此不计算在内。

  2. 题目描述:

    字节跳动有很多个机房,每个机房可能会有很多个网段(如 10.1.2.0/24),网段之间会有包含关系,当出现包含关系时,以小的网段为准。如机房1对应网段10.1.0.0/16,机房2对应网段10.1.2.0/24,那么现在有一个IP 10.1.2.3,其应当归属于机房2。

    公司内我们经常会遇到一个场景:要查询一个IP所在的机房。请你写一个程序,根据输入的网段信息和所需查询的IP给出所在的机房。为了简化问题,在这里我们认为所有IP都是可分配的,即不考虑网段地址和广播地址,将这两种地址也认为是可分配地址。

    输入描述:

    第一行包含两个整数n和m。随后n行,每行有两部分组成,第一部分是机房编号,第二部分是网段信息,格式如下:

    idc net

    随后m行,每行是一个IP,表示需要查询的IP。

    保证所有的网段以及IP都为IPV4格式,不存在IPV6 的输入数据。

    要注意,输入可能存在一个大网段被多个小网段切分完毕的情况。

    数据范围:

    对于30%的数据:1<=n<=10、1<=m<=100;

    对于60%的数据,1<=n<=1000、1<=m<=5000;

    对于100%的数据,1<=n<=5000、1<=m<=50000。

    输出描述:

    输出一共有m行,每行为一个整数,代表第Mi行IP对应的机房编号。

    如果所输入的IP没有找到对应的网段信息,就输出-1。

    示例1:

    输入:

    4	4   
    1 10.1.2.0/24  
    2 10.1.0.0/16   
    1 10.1.5.0/24   
    2 10.1.2.128/125  
    10.1.2.3 
    10.1.2.129
    10.3.2.1
    10.1.5.2
               
    输出:
    1
    2
    -1
    1
               
  3. 题目描述:

    两姐妹小蔓和小玉玩抽牌游戏:一共n张牌,两人轮流抽排,先手者的第一次抽可以抽任意张但不可抽完,以后每次抽都只能抽取不超过上一次抽牌数的两倍(不可不抽)。谁先抽完牌谁赢(没得抽的算输)。由姐姐小蔓先抽。假设该游戏会进行t轮,每轮重新给出新的n。请问先手的姐姐小蔓一共能赢其中的多少轮呢?(注:两姐妹冰雪聪明,都会做出对自己最优的策略)

    输入描述:

    第一行,一个数字t

    接下来t行,每行一个数字,n

    输出描述:

    一个数字x,代表姐姐小蔓赢得轮数

    示例1:

    输入:

    2
    4
    ​5
               

    输出:1

    说明:

    2<=n<=1e9

    30%的数据(1<=t<=10^3)

    60%的数据(1<=t<=10^5)

    100%的数据(1<=t<=10^6)

  4. 题目描述:

    我们在使用Tensorflow等编写神经网络时,为了使代码逻辑清晰,可能会造成运行时的低效。小熊写出了如下的计算式:

    (p0-(p1 /(p0 + (p3-p4))))+ (p2*(p1 /(p0 + (p3- p4))
    在Tensorflow中可以表示为如下图一,其中p1/ (p0 + (p3 - p4))计算了两次。还好Tensorlfow提供的XL A(Accelerated Linear Algebra)对此进行了优化,只需计算一次,计算流程被优化为如下图二形式。
    字节跳动2020-ByteCamp暑期夏令营研发组习题
    小熊露出了满意的笑容的同时,开始思考这个过程是怎么完成的。他已经把这个问题简化,他使用前缀表示法来表示这些计算式,并限定操作符于{+,-, *,/},操作数为单个小写字母。可描述如下:

    E in{a, b,…Z}

    f in{t,-,*k,/}

    F= f(E, E)

    F= f(E, F)

    令上述表达式中p0=a, p1=b, p2=c, p3=d, p4=e,前缀表示法可表示为:
    +(-(a,/(b,+(a,-(d,e)))),*(c,/(b,+(a,-(d,e)))))

    他希望能将这个表达式的计算节点优化到最少,能不能帮他写个程序来完成这个任务?

    对于每个表达式,将其计算节点优化到最少。并将优化的子表达式以一个数字表示,这个数字指向等于此子表达式的根节点的序号。节点的序号从1开始,按前序遍历分配,如果是重复节点则不分配编号。如"a+a"可转换为前缀表达式"+(a,a)",第二个"a"发现第一个"a"作为节点(编号2)已经出现过,因此可优化为"+(a,2)",2表示指向编号为2的节点。

    而在"+(-(a,/(b,+(a,-(d,e)))),(c,/(b,+(a,-(d,e)))))“中,“a"和”/(b,+(a,-(d,e)))“都是重复的, 其中a第一次出现的节点编号为3,”/(b,+(a,-(d,e)))“第一 次出现的根节点”/“编号为4,因此可以优化为”+(-(a,/(b,+(3,-(d,f)))),*(c,4))”。

    输入描述:

    第一行包含一个数字c,表示将要处理的表达式行数,不超过200行。接下来的c行每行包含一个表达式,表达式的形式由上述给出(已转换为前缀形式,无空格,有括号)。最多包含10000个节点。

    输出描述:

    对于每个表达式,输出按说明中优化后的表达式。

    示例1:

    字节跳动2020-ByteCamp暑期夏令营研发组习题

转载说明

本文首先发布于个人博客上,转载请注入声明。

继续阅读