【面经】实习面经

笔试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3.11 19:00 美团
3.12 19:00 拼多多
3.13 19:00 百度
3.23 19:00 腾讯音乐
3.26 20:00 腾讯
3.27 14:00 PayPal
3.28 19:00 蚂蚁
3.29 19:00 字节
3.31 19:00 恒生
4.02 19:00 吉比特游戏
4.06 19:00 shein笔试
4.18 14:00 字节
4.22 14:00 网易
4.26 14:00 Amazon
4.26 19:00 华为
5.13 19:00 字节
5.14 20:00 华泰证券

面试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3.21 16:00 字节一面
3.22 15:00 美团一面
3.22 19:00 蚂蚁一面
3.23 14:00 携程一面
3.23 15:00 携程二面
3.31 9:30 PayPal一面
3.31 14:10 携程HR面
4.11 11:30 恒生一面
4.14 19:00 美团一面
4.20 11:00 美团二面
4.24 11:00 shein一面
4.27 14:30 腾讯一面
5.16 10:00 腾讯云一面
5.17 9:00 腾讯云二面
5.25 21:00 腾讯云HR面

24届暑期实习

1.美团

笔试3.11

  • 1.给一个由数字组成的字符串,你可以任意将其中一个数字改成其他任意数字,目标是得到一个相邻数字不能相同的字符串,求最小修改次数
    • 开记忆数组dp[i]来记录dp[i]是否被修改,已AC
    • 思路为比较s[i]和s[i+1]是否相同,如果相同的话就要去改s[i+1],res++
      • 但是如果i是之前已经被修改了,那说明这一次不用改(因为实际上i已经被改成与i-1和i+1都不同的一个理想数了),res不用增加
  • 2.在n*m的矩阵里走,每个点可能是红色或蓝色,同色不用花钱,走到不同色需要花固定k个金币,每走到一个点可以获得对应金币,求整个过程中能获得的最大金币数量
    • 动态规划,卡36%
  • 3.给一个流星出现的数组和一个对应的消失的数组,求能看到最大数量流星的数量和时刻数
    • 同lc2251花期题,把出现和消失放一个数组,然后排序,最后再从头遍历一遍,维护一个当前流星的数量now,已AC
  • 4.两个坦克在16*16上走,给两个256长度的字符串表示两个玩家的操作命令,可以操作它们移动转向、开火,不能走对方走过的路径,摧毁对方或者走的路比对方多就获得胜利,输出获得胜利的玩家和回合数
    • 常规字符串处理题,卡45%
  • 5.一个二叉树,每个节点可能是红色或蓝色,如果某节点的子树红的和蓝的数量一样就称其平衡,求这颗树的平衡节点数
    • 用递归,没时间做了

技术面3.22

  • 1.介绍一下自己
  • 2.项目
    • tt核心链路
      • 这个日志事件处理的qps是多少
      • kafka处理的频率是什么,多久触发一次
    • 深挖秒杀系统的结构设计
  • 3.数据库
    • mysql的引擎有几种,这三种分别有什么区别,mysql默认的是哪种,行锁是哪个引擎默认加的
      • InnoDB:mysql默认引擎,用于事务,支持行锁,适合大规模数据
      • MyISAM:不支持事务,适合小规模
      • Memory:数据放到内存中
    • 索引的实现方式,B+树为什么好
    • 跳表为什么快,既然跳表和b+树这么像,为什么mysql要有b+树而不是跳表
      • b+树的深度浅,每次读一个节点要一次IO,减少了IO次数
      • b+树的IO次数少,b+树的节点可以存多个关键字,并且单个节点可以与磁盘页对齐(16kb),这样一次IO就可以传输一个完整节点。而跳表可能出现跨页IO
      • b+支持范围查询和排序操作,跳表只支持单个关键字的查找
      • Innodb引擎出现的时候,跳表还没得到广泛应用
    • mysql一张表的qps
    • 事务的隔离级别、特性,会出现什么问题
    • Innodb是怎么解决幻读的
      • 用next-key lock机制解决,里面包含间隙锁和行锁,间隙锁会锁上记录之间的间隙,比如对5到10行的记录上next-key lock就是由(5, 10)之间的间隙锁和加在10上的行锁组成 lock间隙锁锁定的是两个索引之间的间隙,而next-key lock会锁定多个索引区间
    • 数据库的锁底层是怎么实现的,类似间隙锁,xx锁这种
      • InnoDB行锁是通过给索引上的索引项加锁来实现的,而不是给表的行记录加锁,通过索引检索数据才使用行级锁,否则将使用表锁
    • Redis为什么快,既然是串行的那应该慢呀
      • 因为Redis是单线程的,减去了CPU切换不同线程的开销,并且Redis是在内存运行的
    • Redis的数据类型是怎么实现的
    • Redis的多路复用模型怎么实现的
  • 4.编程语言
    • 了解过java结构么,介绍一下jvm
  • 5.算法题
    • 翻转链表
    • 给一个字符串,求最长不含重复字符的子串长度
      • 写了滑动窗口解法后,面试官要求不要用双层循环,改成用一个set存已经遍历的字符,对应right新遍历到的字符如果set里面已经有了,那么left就直接前进到set里存的下标后一个位置

一个小时。对基础八股问得少,都是变形和进阶。开始觉得没希望了,最后编程题秒解感觉面试官就又想捞了,最后说语言和基础不是最主要的,主要考察反应和逻辑能力

技术面4.14(直播)

  • 1.介绍一下自己

技术面4.20

  • 1.介绍一下自己
  • 2.深挖tt生产链路
    • hive2es这一步是怎么做的,用什么语言实现的
    • 如何保证hive和es里的数据一致
    • 对实时性和准确性的要求是什么
  • 3.算法题
    • 给一个n*n的数组,从左上角开始按对角线依次打印数组
      • 用队列撕出来了,每一次box()运行都会去打印队列里的全部元素,并且同时判断(j+1,i)、(i+1,j)合不合法,若合法则放入队列进行下一次打印

2.拼多多

笔试3.12

  • 1.压缩字符串,给一个”1a3b2c”的压缩字符串,还原它本来的形式”abbbcc”
    • 遍历,维护一个count,然后遇到字符就加count个该字符,并把count置0,AC
  • 2.有n个敌人,每个敌人有不同的血量,有两种操作(1)对当前敌人和后一个敌人造成1点伤害(2)直接秒杀当前敌人
    • 贪心,只有当当前敌人血量为1时才用(1),否则(2)永远要更划算,AC
  • 3.有三个活动(A,B,C),每个活动分别有人数上限和每个人参加的费用,参加团建的有N个人,每个人有一个或多个想参加的活动,但每个人最多只能参加一个活动。请问如果能满足所有人都参加活动,请输出最少的团建活动的总费用,如果不能满足所有人都参加活动,请输出能满足最多参加活动的人数。
    • 网络流。没做出来,贪心骗了75%
      • 网络流是,有一个起点和一个终点,它们之间有很多其他点,这些点之间有流量大小不同的管道,输入起点的流量是无穷大,求最后终点能得到的最大流量
  • 4.给一个每天营业额的数组,输出一个当前营业额平均数组和一个当前营业额中位数的数组
    • 大根堆和小根堆实现中位数,sum累加实现平均数,AC

3.百度

笔试3.13

15道单项选择、5道多项选择(错选不得分,少选得1/3),涉及OS、计网、mysql、linux和C++语法(指针最爱考),选择题共70分

  • 选择题知识点:
    • slelect 1和select null会返回一个行数和原表一样的临时列,列值分别为1和null
      • select null不能用count()和sum()
    • const直接修饰的不能变,例如const *p则p指向的地址不能变,* const p则p的值不能变
  • 1.给一个字符串,判断其能不能重新排列后生成”Baidu”
    • 将”Baidu”排序,然后再将字符串排序后比较是否相等即可,AC
  • 2.给一个整数x,请你生成一个字符串使得该字符串的回文子串数量正好等于x,该字符串只能包含’r’’e’’d’
    • 暴力生成字符串,过了32%
    • 正确解法:
      • 首先记住,同一个字符构成的字符串,它的回文子串数量为n*(n+1) / 2,即和等差数列求和公式差不多
      • 因此先从1开始遍历,去找最大的n满足n*(n+1) / 2 <= x,然后就往字符串里填n个’r’
      • 然后还需要增加x-n*(n+1) / 2个回文子串才能满足要求,这时就依次填’e’’d’’r’进去,按这个顺序填每次多填一个数,只会新增一个回文子串
  • 3.给一棵二叉树的每条边和节点颜色数组,每个节点是蓝色或红色,定义每条边的价值为删掉这条边后形成的两部分树,同色连通块的差值绝对值
    • 想用并查集来做,但是并查集保留信息不够,0%
    • 正确解法
      • 用dp[i]存以i为根节点时,同色连通块的数量
      • 断开某条边的会产生一个左节点、一个右节点
        • 左节点的同色连通块 = 总的同色连通块数量 - dp[右节点]
          • 如果左节点和右节点颜色一样, 左节点的同色连通块还得+1
        • 此时断开该边的价值 = abs(左节点的同色连通块 - dp[右节点])

5.米哈游

笔试3.20

10道单项选择、10道多项选择

  • 选择题知识点:
    • stat file能查看文件的信息,包括indoed
    • 进程从运行态变成就绪态是因为时间片用完了
    • TCP三次握手第一次的底层,是把TCP头的SYN标志位置1
  • 1.一个矩阵每个位置只能是R、G、B三种颜色,小红是色盲她会把G当做B,请问小红眼中的同色连通块数量,比起实际的同色连通块数量少了多少
    • 并查集,AC
    • 实际的一个并查集,色盲的一个并查集,遍历每个位置然后判断往右下判断是否同色,若同色就连在一起
  • 2.有两个字符串s和t,你可以无限次对s进行加”mhy”或者减”mhy”,请问s能不能变成t
    • 哈希表,AC
    • 记录s和t中每个字符出现的次数,然后mhy三个字符单独判断一次差是否相等,再对其他字符进行判断
  • 3.给一个数组,求满足1.后一个数是前一个数的倍数 2.数组长度大于1的子数组数量
    • 用dfs做,20%
    • 正确做法:最长递增子序列的贪心法
      • 先sort()排序,dp[i]表示以nums[i]结尾的子序列的个数
      • 双层循环
        • 外层循环ans += dp[i],表示以nums[i]结尾的子序列的个数
        • 内层循环遍历j = 1; j * j <= nums[i]
          • 如果nums[i] / j存在,dp[i] += dp[pos[nums[i] / j]
          • 如果j存在,dp[i] += dp[pos[j]]
        • pos表示值在nums[i]中的下标,即pos[nums[i]] = i,不存在的值pos置为-1
        • 注意base处理,外层循环的最后还要dp[i]++,但是ans要在这之前,因为ans只包含长度大于1的组合,但是长度=1的组合可以参与下一次的计算

6.字节跳动

技术面3.21

  • 1.介绍一下自己
  • 2.介绍一下tiktok实习主要参与的项目
    • 广告主查前六天的数据,是会分成查一天实时和五天离线的么
    • 广告主对广告的付费方式有哪几种,采用得最多的是哪一种
      • CPC(Cost Per Click):按点击次数付费,用得最多
      • CPM(mille):按展示次数付费,一般用千次展示费用
      • CPA(action):按转化事件付费,比如下载、注册等
      • CPV(view):按浏览次数付费,用于视频广告
      • CPS(sale):按转化金额付费
    • es和mysql的索引有什么区别,为什么es更快
      • ES可以处理非结构化和半结构化的数据,支持一个文档里包含多种类型的数据,
      • ES更快是因为使用倒排索引,将每个词汇映射到包含该词汇的所有文档的ID,搜索时ES无需遍历整个文档集合,只需要在索引中查找包含关键字的文档即可
  • 3.计网
    • TCP是在哪一层,IP在哪一层
      • TCP在传输层,IP在网络层
    • 是TCP包含IP包,还是IP包含TCP包
      • TCP里包含IP包
    • TCP报文头里包含什么
      • 源端口号
      • 目的端口号
      • 序列号:占4字节,表示当前报文的序列号,用于保证传输的有序性
      • 校验和
      • 窗口:占2字节,表示接收方所能处理的数据量
      • 标识位:ACK、SYN、FIN等
  • 4.操作系统
    • 介绍一下进程和线程,线程独有的资源是什么
      • 栈空间
  • 5.数据库
    • 索引的实现方式,B+树为什么好,B+数对比哈希表实现有哪些优点(3个以上)
      • B+树可以实现范围查询,B+树不会有哈希冲突导致效率降低的问题,B+树可以减少I/O开销
    • 跳表为什么快,查询、插入、删除复杂度是多少,为什么
      • 跳表原理是二分查找,所以快。查询、插入、删除的平均复杂度都是logn
  • 6.编程语言
    • 介绍一下go的gmp模型,如果此时某个p的本地队列已经空了怎么办,如果此时中央队列也空了怎么办,它会到别的p的本地队列去取么
  • 7.算法题
    • 给一个链表1-2-3…-n,返回1-n-2-n-1….这样的新链表,先说思路再动手敲,每种思路说明时间空间复杂度,递归的复杂度是多少
      • 第一个思路:用数组存,然后双指针遍历赋值
      • 第二个思路:找到中间节点,然后将后面的链表翻转,再双指针遍历赋值
        • 代码没调试好,最后一行一行讲了思路
      • 递归的时间复杂度=递归函数的时间复杂度 * 递归深度,空间复杂度同理
        一个小时。对基础八股问得少,都是变形和进阶。
  • OSI七层模型每层的协议都要背
  • 编程题调试困难,一定要及时提出可不可以用自己本地ide调

笔试3.29

  • 1.给一个数组和一个k,只能进行两个元素交换位置的操作,求最少需要几次操作才可以让值为k的元素互相相邻
    • 贪心法过54.55%
  • 2.
    • 77.78%
  • 3.给一个整数k和n个长度为3的数组,每个数组{a,b,c}表示可以画一条ax+by+c=0的直线,其中(x,y)是二维平面的坐标,你可以画k条直线,求所有方案中直线交点的最大数量,注意若3条直线相交于同一点,则交点数量可记为3个
    • 骗14.81%
  • 4.给三个数组和k,分别表示第i场比赛,正常比赛收益、作弊收益、作弊风险,如果作弊的话可以获得作弊收益,但要承担作弊风险,求作弊风险 < k的情况下,最大收益是多少
    • 贪心法过25%

笔试4.18

  • 1.
    • AC
  • 2.给一个信号塔的强度数组,每个信号塔的信号强度取别的信号塔辐射到该处的最大强度,f[i] = f[j] - abs(i-j)*c,求最终每个信号塔的强度数组
    • 暴力过75%
  • 3.操作系统处理字符串题,给文件夹路径,然后再给文件夹移动命令,求最后每个文件夹包含的子文件夹数
    • AC
  • 4.小红的新函数,实现一个函数f(),输入i,返回i的二进制的末尾最长连续1的个数,给一个n,要求返回小于n的f(i)之和
    • 备忘录过70%,内存超了

笔试5.13

  • 1.矩阵旋转题,给一个字符矩阵,然后问左移n位后的第i行j列是哪个字符
    • AC,数学计算解法,一开始处理边界时间花太长,这种题应该写例子在一边来分析,不要纯抽象,并且一旦花时间长就先做后面的换一下思路,回来再做
  • 2.和4.18一模一样的信号塔题
    • AC,通过计算两个辅助数组dp1,dp2来算
      • dp1[i]存i后面的最大f[j]-c*j
      • dp2[i]存i前面的最大f[j]+c*j
      • 最后的ans[i] = max(dp1[i] + c*i, dp2[i] - c*i)
  • 3.池塘上有n片荷叶,荷叶有分值,每次可以跳x步,x是2或5的倍数,跳到荷叶可以获取荷叶的分值,求跳到岸边的最大分值和
    • 10%,题目有点问题,没解释题意
  • 4.给一个书的高度数组和k,每层书的最大高度差不能超过k,求书架每层的最大宽度和满足这个最大宽度和的状态有几种,注意:这个宽度指的是如果一种放书方案里,放书最多的层放了3本书,那么这个书架的宽度就是3
    • 40%,值域二分法求出来了书架每层的宽度,但是具体状态没时间写了,用回溯法应该能AC

7.蚂蚁

HR面3.22

  • 1.介绍一下自己
  • 2.介绍一下两段实习都做了什么
    • 碰到的项目难点有什么,怎么解决的
  • 3.学习模式
    • 平时是怎么学习的,会看文档和源代码么
    • 如果重新让你学一门编程语言OK么,你会怎么学
  • 4.上线规范
    • 业务方提不合理的需求怎么处理
    • 会从技术架构上去帮业务方解决问题么

半个小时。基本都在问工作的事,没问技术,应该是非技术的HR

笔试3.28

9道单项选择、6道多项选择

  • 选择题知识点:
    • cache-Control字段的常用值有:public、private、no-cache、max-age
    • 信号量A初值为10,若干进程对A进行25次P操作、9次CV操作后,此时有几个进程在等待A
      • P操作会对信号量+1,CV操作会对信号量-1,信号量负的值表示有几个操作正在等待,10-25+9 = -6,应该有6个进程在等待
    • Linux的文件权限操作chmod
      • 三位数字
        • 第一位表示文件所有者,第二位表示同组用户,第三位表示其他用户
        • 7表示可读可写可执行,6表示可读可写,0表示无任何权限
      • u+x表示给拥有者加执行权限,o-r表示给其他用户减读权限
    • DMA方式和I/O通道
      • DMA:有专门的硬件DMA控制器直接读取内存中的数据,CPU仅需要启动传输并在传输结束时进行中断处理即可,例如硬盘、光驱
      • I/O通道:专门的硬件设备控制外设与主存之间的数据传输,CPU仅需与I/O通道进行简单的指令交互,例如视频采集卡、音频处理卡
  • 1.给一个n,你需要找出c = a + b的最大c,其中a、b、c都是质数
    • 最速求质数函数+备忘录,AC(这里要注意1不是质数)
  • 2.给一个n,你需要构造一个不含重复元素的n行数组,第1行有1个元素,第2行有2个元素以此类推,其中需要满足A[i][j] ^ A[i+1][j] ^ A[i+1][j+1] = k,这个k可以你自己指定
    • 骗6%
    • 正确解法:队首固定为
  • 3.给一堆零件的生产时间和生产条件,其中生产条件里会包含不定数量的其他零件,最终该零件的生产时间=它本身的生产时间+生产条件要花的时间,请输出每个零件的实际生产时间
    • 用vector套pair<int,int>的结构存储 + 拓补排序,AC

8.携程

技术面3.23

  • 1.介绍一下自己
  • 2.项目
    • 介绍一下在tiktok都做了什么
    • 深挖秒杀系统结构设计
      • 秒杀系统最重要的是什么,怎么实现的
        • 异步、削峰
  • 3.数据结构
    • 介绍一下数组和链表,它们有什么区别
    • 介绍一下哈希表, 负载因子应该怎么设置
      • 负载因子=已保存节点空间/哈希表空间,一般设为0.75
    • 介绍一下快速排序和堆排序
  • 4.计网
    • 介绍一下OSI七层模型,平时使用哪层比较多
    • 介绍一下http,介绍一下get和post请求,它们有什么区别
    • 如果我想http实现长连接应该怎么做
  • 5.数据库
    • mysql用的引擎是什么,他有什么特点
      • Innodb,默认行级锁,支持事务,实现了事务的四大特性和隔离级别
  • 算法:手撕快排(想出堆排的,考虑到拿纸写有点复杂就改成快排了)

一个小时线下面试。基础数据结构问得很细,http请求也问得很细,最后手写快排

技术面3.23

  • 1.介绍一下自己
  • 2.项目
    • 深挖河海大学校友平台
      • 用户状态是怎么保存的,token放在请求的哪里
    • 深挖tt核心链路
    • 深挖秒杀系统结构设计
      • 大流量打过来,怎么削峰,你这个拦截接口是怎么设置的
        • 拦截接口,相当于另起一个服务
  • 3.数据结构
    • 介绍一下栈和队列
  • 4.计网
    • 介绍一下get和post请求,它们有什么区别
    • 你理解的跨域问题是什么,怎么解决跨域问题的,不同服务之间调用会有跨域问题么
  • 5.数据库
    • 之前的项目里你建过哪些库和表,怎么设计的
    • mysql的索引用的是什么,有什么特点
    • redis的哪种数据结构是有序的
      • zset
    • 了解MVCC么,介绍一下
      • 目的:MVCC通过保存数据的历史版本,根据比较版本号来处理数据是否显示,从而达到读取数据的时候不需要加锁就可以保证事务隔离性的效果
      • 实现:InnoDB中的MVCC实现是通过undolog日志实现的,执行更新操作时,会把更新前的数据放入undolog里面,并通过隐藏的回滚指针roll_pointer指向。其他的事务,如果需要查询该记录,就会去undolog里面找这个记录的最新历史版本
      • 好处:MVCC 最大的好处是读不加锁,读写不冲突,极大地增加了 MySQL 的并发性。通过 MVCC,保证了事务的隔离性
  • 算法:手撕队列实现栈(一开始也问栈实现队列的思路)
    • 两个队列q1、q2
    • push正常压入q1
    • pop就q1一直出队列送给q2,然后只剩一个的时候就返回这最后一个元素

一个小时线下面试。校友平台和秒杀系统项目问得很细,包括结构,在写队列实现栈的时候有点卡逻辑了,忘了转移的时候保留最后一个数作为弹出

HR面3.31

  • 介绍一下自己
  • 什么契机让你想转专业
  • 老家是哪的,对未来工作的城市有什么打算,在上海有亲戚吗
  • 英语能力怎么样,如果让你现在来一个英语介绍可以么

30分钟。HR面主要考察性格职业规划等,第一次碰到女面试官。实习薪资大概4K,有房补和餐补。出勤日满50天可申请转正PPT答辩,会为每个实习生预留HC,实习生转正完后剩余HC才会外放。

5.06已Offer,5.22入职,感谢携程

9.腾讯娱乐音乐

笔试3.23

  • 给一棵二叉树,它有n个节点,你可以用1-n的数字为每个节点赋值,不允许重复使用,如果满足奇数层和与偶数层之和的差的绝对值 < 1,那么就返回这棵树,否则返回空指针
    • 15%
  • 给一个字符串,字符串的价值=长度*字符种类,现在要把它分为k个子串,设m为所以子串中价值最大的子串的价值,求最小的m
    • 用值域二分法,细节没处理好只过了25%
    • 先确定子串最小价值为1,最大价值为整个字符串的价值
    • 然后用二分查找去判断mid是否合法
    • 写一个bool isValid()来判断是否可以分割成子串最大价值不超过mid的情况
      • 用贪心法,一旦加上下一个字符价值超过mid,那么就在该处分割,后面属于新的字符串
      • 最后判断分割出来的子串如果小于等于k就返回true,否则返回false
  • 求相邻的字符对数,例如”aaabb”,相邻字符对数为2+1=3
    • AC

10.腾讯

笔试3.26

  • 给一个链表,要求两个链表为一组,然后两个组整体交换位置,例如1->2->3->4要变成3->4->1->2
    • 四个指针,AC
  • 给n个字符串,要求从每个字符串里取一个字母构造成一个长度为n的新字符串,这个新字符串里不能有相同的字符,请问有几种构造方法
    • 回溯+备忘录,AC
  • 给两个数组A,B,数组长度都为N,构造一个数组C满足以下条件1.长度为N 2.数组元素范围为[1,N],且元素值不能重复 3.如果B[i]> B[j],那么一定要保证C[i]> C[j],注意这里的i<j 4.数组C与数组A每个元素之差的和的绝对值最小,并输出这个值
    • 骗14%
    • 正确解法:构造pair<int,int>分别存A、B的值,然后优先按B降序排序,B相同的就按A降序排序,然后再用贪心从N开始赋值
  • 给一个数组,求他有几个子数组满足里面所有的元素之积==里面所有元素之异或
    • 用前缀数组双层遍历,只过了32%
    • 正确解法:满足要求的子数组,只有可能是若干个1和1个别的数字,下次碰到异或题要细想数学法
      • 先枚举所有连续1的区间,分奇偶求出奇数个1子串的数量,然后就是中间非1往两边扩展1,根据左右的数量算有偶数个1的数量
  • 给一个数组和整数k,你可以删除它里面的任何数,让剩余数的最大公约数等于k,求删除的方案数
    • 骗5%
    • 正确解法:分解质因数

技术面4.26,wxg

  • 1.自我介绍
  • 2.算法题
    • 原地翻转字符串
      • 双指针交换
    • 求n!结尾连续0的数量
      • 统计2、5因子数,或者只需要统计5的,因为n!的2因子一定比5多
    • 判断二叉树是否平衡(左右高度差<=1)
      • 递归
    • 交换第k和倒数第k个链表节点的值
      • 维护两个指针,一次遍历解决
    • 思维题:有一群人,眼睛是棕色或蓝色的,所有蓝颜色眼睛的人必须离开
        1. 每个人都看得见别人眼睛的颜色,但不知道自己的。别人也不可以告知
        1. 每天白天,岛主会宣布岛上是否还存在蓝眼睛
        1. 蓝色眼睛的人如果「确定」自己是蓝眼睛,必须无条件乘坐当天晚上的渡船离开
      • 那么请问所有蓝眼睛的人,要花几天才能离开这个岛?
  • 3.八股
    • TCP三次握手,改成两次行不行,如果按两次算建立连接,那么此时发数据会有什么错误
    • 那这个数据包在传输过程中被修改怎么办? 那连校验和也修改了怎么办?
      • 校验和、https加密
    • https的加密方式,什么时候传私钥公钥,什么时候是对称加密
      • s端传证书的时候会把公钥传过去,然后c端用公钥加密了对称秘钥后再传回来,这时s端用私钥解密即可得到对称秘钥了
    • 项目里mysql的一张表大概是多少数据量,如果特别大,有什么办法去解决慢和被打崩的问题
    • 你使用redis的时候会设置过期时间吗,时间到了redis会怎么去删除?

11.PayPal

1
2
3
4
5
6
7
8
- 一面官方考点:
- 数据结构:数组、字符串、链表、动态数组、哈希表、栈、队列、二叉树、平衡树、红黑树
- 在无序数组里面找到最大/最小的第N个数:用优先队列做,要求实现就手撕堆排序
- 在一个环状链表中交换首尾节点:新增pre指针来记录
- 在二叉树中算出两个节点之间的距离:先找最近公共祖先,然后祖先往下分别去找它俩
- 算法:搜索算法、排序算法、模式匹配、分而治之、动态规划
- 给一个有序数组和目标值x,找到和为x的组合:dfs+回溯
- 找到所有1(...00....)1的模式,在一个字符串中:kmp匹配算法

笔试3.27(HackerRank)

  • 6道选择题,3道编程题,选择题考数据结构和读代码
    • 编程题1:数据库查表,查成绩大于平均成绩的学生的信息
      • AC
    • 编程题2:用Java实现3个有继承关系的类,打印出对应string,包含了类成员函数重载的使用
      • AC
    • 编程题3:n*m矩阵,为0的有地雷不可以走,求从(0,0)走到(n-1, m-1)有几种走法
      • 常规动态规划题,AC

面试3.31

  • set和array的区别,set是怎么实现唯一的
    • 唯一性。set的底层是红黑树,但是保证唯一性用的是哈希表
      • 保证唯一性的底层实现是,先判断key得到的hashcode有一样的么,如果有,那么再调equals()去检查
  • 如果发生哈希冲突应该怎么处理,哈希表的时间复杂度是多少
    • 链表法
  • 二叉树插入元素的时间复杂度
  • 动态数组删除元素的时间复杂度
  • unordered和普通的数据结构有什么区别,比如unordered_map和map
    • 底层:unordered_map是hash_map,map是红黑树
      • hash_map是由vector和链表构成,每个vector的位置连一个链表,声明的时候就会自动初始化一个vector去占用空间(质数,不同编译器用不同的质数比如53)
    • 顺序:unordered_map是插入顺序,map是按key从小到大排列的
    • 插入、查询、判断key值开销:unordered_map是O(1),map是O(logn)
  • 算法:
    • 1.将两个有序数组合并成一个有序数组
    • 2.给一个数组,判断里面相同数字出现的次数是否唯一,例如[1,1,2,3,3,3]输出true,[1,2]输出false

开局就英语交流,然后让开hackerrank并共享屏幕作为待会代码测试的平台,然后英语介绍自己部门的业务,并要求做个自我介绍。两个面试官,一个负责八股,八股主问数据结构,一个负责算法。外企题目难度不高,但是英语需要增强,最后面试官也给建议如果要面外企的话口语得再练练

12.恒生电子

笔试3.31

  • 不定项选择题+sql题+算法题
    • 非对称加密算法有RSA和DSA
  • 1.一个N位数,他的每一位的N次方合起来等于他本身,那么就把他叫做超完全数字不变数,给你一个n,求小于n的所有超完全数字不变数
    • 暴力枚举+剪枝,AC
  • 2.股票交易,可操作次数k次,初始资金为M,给一个每天股票的单价,求最大收益
    • 股票交易4变形题,改一下初始状态和转移方程即可,AC

13.吉比特游戏

笔试3.31

  • 选择题20道+填空题6道+2道算法题
  • 1.给两个字符串s1和s2,s1可以删除任意个字符,求s2与s1可以匹配的最大下标,例如s1=abcdacd,s2=ad,那么结果应该返回4
    • 枚举+剪枝,过80%,剩下20%应该是没处理不能匹配的情况
  • 2.给m条无向边,从0点出发,每个点最多访问2次,求访问到所有点的最小花费
    • 骗10%
    • 正确做法:状态压缩dp,这是一个典型的求最短哈密顿路径
      • dp[S][i],S是用二进制1001的形式表示经过哪几个点,i表示以i点结尾
      • s-t的最短哈密顿路径指的是,从s点出发到t点要过所有点的最短距离

14.Shein

笔试3.31

  • 单选题10道+多选5道+1道sql+1道算法
    • 解决哈希冲突
      • 开放寻址法:从发生冲突的那个位置起,按照一定的次序,放到空闲的单元
        • 线性探测、平方探测、双重散列探测、伪随机数探测
      • 链表法:也叫拉链法
      • 再哈希法
      • 公共溢出区法
  • 1.给一张回答问题表,求每一天的回答问题用户数/回答数,保留两位小数
    • 难点在于用CAST() AS DECIMAL(10,2)这个模板转保留两位小数,AC
    • slelect (CAST(COUNT(DISTINCT(user)) / COUNT(date)) AS DECIMAL(10, 2)) AS res from xx GROUP BY date
  • 2.求一个字符串里,最长的不含重复字符的子串
    • 双指针,AC

面试4.24

  • sql的having语句
    1
    2
    3
    4
    select user_id, count(user_id) t
    from xx
    group by user_id
    having t >= 3
  • 这个语句是一个慢查询,你分析可能是什么原因
    • 没有用到索引
    • 内存不足
    • 查询出的数据量过大
  • 解决慢查询用explain关注哪些指标
    • type:用来表示该sql底层是怎么扫描的,值有:all全表扫描,index全索引扫描、null表示不用去表里查可以直接得到结果
    • possible_keys:可能用到的索引列
    • key:实际用到的索引列
    • Extra:底层用的是哪种检索方式,值有:Using where用where来处理结果,Using index condition表示用索引
  • 如果sql没问题的话,从哪里可以解决
    • 系统架构上,比如用redis增加前置缓存、分库分表
  • redis断电会丢失吗?
    • 可以采用持久化策略保证,但是不能保证完全不丢失,例如60分钟是记录时间,最多可能会丢失59分钟的数据
  • rabbitmq如何保证消息不丢失,如果发送了多次相同的消息要怎么处理
    • 消息丢失有三种
      • 生产者发给mq途中丢失:开启confirm机制给每个消息分配一个id,生成者发送消息后mq收到返回ACK,没收到返回nack
      • mq因为断电等情况丢失:设置消息持久化和镜像集群
      • mq发给消费者途中丢失:开启AKC应答机制,即消费者收到后给mq回一个ACK
  • java频繁触发GC可能是什么问题
    • 堆空间不足
  • 三次握手改成二次行不行
    • 不行
  • 四次挥手改成三次行不行,其实是有三次挥手的而且速度比四次快很多
    • 四次挥手是考虑到S端要关时,C端数据还没传输完成
    • 三次挥手是存在的,
  • TCP是全双工的吗? 为什么打电话只要两次握手,TCP要三次
    • 打电话是进程阻塞的,TCP是可以多进程的
  • 有试过抓包吗,看看里面的东西

15.网易

雷火笔试4.23

  • 单选题10道+多选5道+2道问答题+2道算法
    • HTTP是应用层协议,ICMP是网络层协议
    • 什么是负载均衡,负载均衡的算法有哪些,分别阐述优缺点
      • 轮询负载:轮流分配到后端服务器上,均衡地对待每台服务器,简单易懂,但可能出现负载不均衡
        • 可以加权改进
      • 随机负载:通过随机算法,随机将请求分配给后端服务器,易于实现,但可能出现负载不均衡
        • 可以加权改进
      • 源地址哈希法:和一致性哈希算法原理一样,负载均衡性提升,但需处理哈希冲突和保证hash环均匀分布
    • 什么是分布式系统的切片策略,切片策略有哪些
  • 1.给一个数组和需要切分的块数k,切分策略的得分是每个块数k的起始值+终止值,求切分策略的得分最大值和最小值的差,例如(1,2,3,4),k=2可以被切成(1)、(2,3,4),它的得分是(1+1) + (2+4) = 8
    • dfs()+回溯,暴力模拟解决,AC
  • 2.给一个矩阵和a、b两点的坐标,求a走到b需要的最短时间
    • bfs(),AC
    • 用队列模拟,每次把能走到的新坐标加入到队列里面进行下一次循环,出现b点时,返回答案

16.Amazon

笔试4.26

  • 给一个表示包裹重量的数组,有两种运输方式,一是运送同等重量的包裹2个,二运送同等重量的包裹3个,求最少能把包裹运完的次数,如果不能运完返回-1
    • 贪心,AC
  • 给一个数组和k,长度为k的子数组如果里面不含重复数字就可以算作合法,求合法子数组的最大和
    • 滑动窗口,AC

17.华为

笔试4.26

  • 1.给相互依赖的模块关系,如果某模块的依赖模块在之前都已经初始化则该模块才可以初始化,求需要几轮初始化才可以完成所有模块(100分)
    • 拓补队列,AC
  • 2.模拟一个资源池,要求实现1.分配n个资源,2.分配指定id资源,3.释放资源,最后返回资源池的第一个资源id(200分)
    • 链表+哈希表模拟,AC
  • 3.给一个初始点长草坐标数组,每隔一天会向上、下、左、右、左上、左下、右上、右下扩张,求最少经历多少天会出现某个坐标拥有M种草(300分)
    • 骗6%
    • 正确解法:二分查找 + 离散化 + 差分数组
    • 自己思路:
      • 给每一个初始点确定一个长到target点的最短时间
      • 然后用二分值域法,去找这个最少天数能拥有M种草

18.腾讯云智

笔试5.16

  • 25道单选59分 + 5道填空10分 + 2道编程40分
  • 1.给一个字符串,求它里面的”CHN”子序列有多少
    • AC,遍历一遍,维护当前的遍历过的C数量和之前能组成的”CH”数量
      • 遇到C就++,遇到H就+=C,遇到N就+=H
  • 2.给两个有序数组,你需要从每个数组里面挑一个数,求最大的k个这两数之和
    • AC,维护一个大根堆存(i,j),每次从大根堆里压出的时候,把(i-1,j)和(i,j-1)压入堆,为避免重复,用备忘录记录已经压入过的组合

面试5.16

  • 介绍一下你认为最有技术含量的项目,这个项目是做什么的,难点是什么
  • unordered_map和map的区别和底层
  • 如果让你设计一个应用层的协议你会考虑什么,怎么去识别包的长度,如果包里本身包含这个特殊字符怎么办
    • 用socket封装实现,基于TCP去实现,考虑首部包含资源的位置、请求的方式、协议版本
    • 1.首部加一个len字段 2.用特殊字符做分割,换一个少用的字符或者加转义符/
  • C++的编译过程分几个阶段
    • 预编译->编译->汇编->链接->执行
  • Linux下查找文件用什么命令
    • find “xx”表示在当前目录及其子目录查找xx
  • Linux下用C++编程的步骤
    • 用vim编写.cpp文件
    • 用g++编译得到.out文件
    • 用./xx.out执行
  • mysql怎么加索引,什么时候要去加索引
    • alter table 表名 add 索引类型 列名
    • alter table 表名 drop xx
  • go的channel底层怎么实现的,如何用它来实现并发,如果channel满了会怎么办
    • ring buffer + 发送队列 + 接受队列

面试5.17

  • 自我介绍一下
  • 怎么理解不同的技术栈,你觉得后端是一个什么样的定位
  • 介绍一下tt工作的背景,这个实时是多少时间,如果需要更实时一点比如秒级、分钟级应该怎么做
  • Hive是怎么实现大数据查询的,mysql为什么不行
    • Hive用MapReduce去分布式查询
    • Hive是将结构化的文件映射成一张表,这个文件是在HDFS上的
  • kafka的特性,怎么保证消息队列的下游接受处理到了消息,这个ACK具体是怎么实现的
    • kafka的ack有以下三种策略:
    • ACK = 0 时 发送一次 不论下游是否接收
    • ACK = 1 时,等待下游接收成功即可
    • ACK = -1 时 ,需等待下游将消息同步给消息队列
  • C++在linux下怎么断点调试
    • 使用gdb,对某行打上断点
    • 然后在生成二进制程序的时候, 加上 -g 选项
  • 了解HDFS么
    • 三大件中的分布式文件存储系统
  • 秒杀系统用到了分布式,讲一讲怎么实现的
  • 你提到未来可以横向扩展这一点很好,那么如果某一个节点挂掉它需要迁移多少数据?
    • 哈希环上,该节点到上一节点之间的数据
  • 如果我想保证在挂掉之后到迁移完成之前,这部分数据用户无感知正常使用应该怎么办
    • 备份节点
  • 未来考虑在哪工作
  • 近几年大数据很火,需要加强大数据方面的知识,三大件

面试5.18

  • 自我介绍一下
  • 博客上的文章都是什么,都是自己写的吗,留一下地址
  • 介绍一下tt工作的背景
  • 介绍一下这个秒杀系统
  • 解释一下一致性哈希算法,如果要新增、删除节点具体会怎么做,如何保证负载均衡
    • 迁移一部分数据,虚拟节点
  • 超卖问题如何解决,如何保证10w个人抢10个商品
  • rabbitmq和kafka的优缺点
    • kafka有ack机制可以保证消息的顺序处理
    • rabbitmq有消息存活时间和延迟/预定消息
    • rabbitmq消息一旦消费成功就会删除,反之处理失败则放回;但kafka会一直保留消息,根据超时时间来删除,可以反复消费消息
    • kafka使用分区的结构,在横向扩展上更有优势
  • 系统出问题了怎样定位,用过压测工具么
    • 打断点,延伸到mysql响应过慢,延伸到慢查询
  • 详细地介绍client端与server端通信的过程,http和tcp有什么区别,https和http有什么区别,https加密是为了保证什么
    • 应用层http,传输层TCP,三次握手,四次挥手
  • 未来考虑在哪工作
  • 大数据也属于后台开发的技术栈,需要学习相关的组件

以往经验

1.道远课堂-北京(Python后端)

技术面6.07

  • 对简历上写的知识图谱项目感兴趣,询问了采用的图数据库和数据规模以及最后实现功能。

询问得知只能实习3个月而且距离毕业时间还早后,就告知不便录取了,后多聊了几句问了一些项目上的问题,说我的简历没问题挺好的,提到现在后端开发多用docker,以后应聘有类似经验会突出一些。

2.滴滴-北京(C++后端)

技术面6.17

  • 1.C++的多态是什么意思,通过什么样的形式实现的?
  • 2.什么是虚函数,怎么样使用虚函数?
  • 3.说一下const关键字的作用和一般使用情景
  • 4.说一下static关键字的作用和一般使用情景
  • 5.了解构造函数和析构函数吗?它们俩可以是虚函数吗?
  • 6.incline函数和宏的区别是什么?
  • 7.说一下你了解的vector和map实现方式和功能
  • 8.线程和进程的区别
    • 进程的资源分配是指什么,举一个具体例子说明
  • 9.同一进程下的线程共享哪些资源?
  • 11.了解字节对齐吗,说一说
  • 12.手撕代码:二叉树前序遍历、中序遍历和后序遍历
  • 13.手撕代码:根据前序遍历和中序遍历重构二叉树(采用每次递归重构前序数组和中序数组的方法,后面试官提出可不可以采用其它形式代替数组,后举出用数组下标替代)

一个多小时的高强度面试还挺累的,现场手写的代码。最终评价是技术上没问题了,基础知识掌握得还算比较扎实,期间问到过自己本科是不是计算机,得知不是后面试官态度更积极了一点。最后有问还需要自学一些后端框架吗,回答是不用,他认为框架这些东西就是实习才学的,在校生应该打好算法、数据结构这些基础。

3.字节跳动-飞书(C++后端开发)

HR面6.20

HR打电话约第二天晚上技术面,技术面内容:

  • 主要考计算机网络、操作系统
  • 现场手撕算法题(不限制语言)
  • 入职后得学Golang
    共计30分钟。后因实验室任务重,最多只能实习2-3个月,HR和面试官商量后婉拒了,询问下次投递大概需要多长实习时间,回答建议4-5个月

4.字节跳动-北京

HR面7.04

打电话询问实习找到了么,意思可以直接发offer,说可以安排发南京的offer,询问建议还是说下次3-4个月时间会更容易接到offer,也提到找内推会更容易被hr看到

5.字节跳动-北京(C++后端开发)

HR面7.08

打电话询问如果远程实习的话,9月以后是否接受继续实习,回答现阶段不准备找实习后,HR表示一周出勤4天即可。

6.赛诚科技-南京(后端开发)

HR面12.07

20分钟电话面,沟通了基本信息和技术栈,询问是否接受入职后转Go和PHP,确定能实习三个月和询问意向薪资后就约了下周现场面试

笔试12.13

  • 1.盒子抽不同颜色球的概率
  • 2.从n个数值中选出最大的m个数,最小算法复杂度是多少
  • 3.小明从家到公司有两路公交线路A和B,如果只等A路车,平均需要5分钟;如果只等B路车,平均需要7分钟;假定两路车运行时间独立,那么小明平均需要等多长时间才能等到A或B路车
  • 4.在一个6*6的矩阵中,每次只能往下或往右移动一格,从起点到终点一共有多少种走法
  • 5.SQL语言中删除一个表的指令是什么
  • 6.填写
    • 常用的编程语言
    • 常用的代码编辑器
    • 用过的关系型数据库
    • 用过的MVC框架
  • 7.数据库中的索引、事务、锁分别有什么作用
  • 8.列出几个linux操作命令及其作用
  • 9.个人平时学习渠道有哪些
  • 10.一个图书管理系统的项目,要求后台能上架、下架图书,前台能注册、登录、借书、还书,假定让你来负责开发后端功能:
    • 结合需求,简单画一下功能流程图
    • 设计数据表,写出每个表的名称和功能
    • 后台的登录与前台的登录,你会采取哪些措施保证安全性

二十分钟。

技术面12.13

  • 1.简单地介绍一下你自己的基本情况
  • 2.说一下struct,为什么有struct后c++还要新增class,它俩有什么区别
  • 3.你实现的这个echo服务器能运行成功吗,试过放到外网进行通信吗
  • 4.你实现的这四个聚类算法都是什么,讲一下K-means你是如何实现的,起始中心点是如何实现的,如果有数据点与中心点的距离很近,这种情况怎么处理
  • 5.你这个自动化仓储系统开发项目是怎么做的,20年的实习具体是做什么的,有负责核心部分吗
  • 6.用过的关系数据库是什么,Redis和Mysql有什么区别
  • 7.说一下事务的四个特性,你理解的事务是什么
  • 8.这个图书管理系统中,你的这个用户表里有借书记录的外键合理吗,说一说用户表和借书记录是一对多还是多对多
  • 9.有使用过后端框架吗,了解过后端开发吗,你理解的后端开发是要做什么
  • 10.有了解过Go和PHP吗

三十分钟。

leader面12.14

  • 未来几年的职业生涯规划是怎样的
  • 考虑回老家工作吗,之前有同事说要回家建设家乡
  • 压力看个人能力,能力强其实公司节奏不算快

三十分钟,聊了技术栈和一些对前沿技术的看法,问了一些生活上的兴趣爱好和未来几年的职业规划,说调休的话需要提前跟他申请

boss面12.14

  • 问了聚类算法的意义以及Kmeans的实现原理
  • 了解过Docker是吗
  • 博客写了多长时间
  • 你觉得实习结束后自己应该有哪方面的收获

二十分钟。boss还是有气场的,面的时候压力蛮大的。

HR面12.14

  • 薪资
  • 未来职业规划
  • 上班时间

十分钟。

不知道是不是非大厂,所以要求实习生入职就能干活的原因,简历上的绩点、奖学金和比赛都不怎么看重,重点全放在项目身上,计网和操作系统也没问,也没有手撕算法,直接就是项目驱动

7.字节跳动-上海(抖音后端开发)

简历面

机试3.20

  • 给一个字符串,将里面的大小写字母不做区分,除字母以外的字符视为*,若处理后的字符串是回文字符串则返回true,否则返回false
    • AC,遍历数各个字母和*出现的次数,然后加上字符串长度判断奇偶
      • 若字符串长度为奇,则允许26个字母和*中有一个数量为奇数
      • 若字符串长度为奇,则不允许26个字母和*中出现数量为奇数
  • 给一个补给站出现的天数和食物价格数组,每天消耗一份食物,求走到n天花费最少的钱
    • AC,用dp[i]记录活到第i天所花最少的钱,用minMoney和minIndex记录第i天之前(包含第i天)最便宜的食物价格和对应天数
    • 状态转移方程dp[i] = dp[minIndex] + (i - minIndex)*(minMoney);
  • 给n组徒弟和师傅的关系,徒弟和师傅一定是在一个部落的,求一共有几个部落
    • 40%通过,时间超时了,因为采用迭代的方法以每条关系中师傅的部落为基准去更新每个人的部落
    • 补牢:用并查集,先用总人数初始化并查集,然后遍历每组关系加入到并查集里面,最后返回并查集的count()
  • 给一个字符串和n组操作开始的和结束的下标,转换下标之间的字符串大小写,求最终的字符串
    • 50%通过,时间超时了,因为每一组都需要去遍历一次(start,end)来修改状态
    • 补牢:用差分数组,每次操作只修改差分数组的两个元素,最后再用差分数组逆推出原来数组,最后根据值为奇数的下标对字符串进行转换大小写

面试4.08(成人与创新部门)

  • 1.介绍一下自己
  • 2.项目介绍
    • 私信功能怎么实现,刷新问题
    • 校友服务是什么
    • 可见范围怎么实现
    • Go的centens库有哪些功能
  • 3.计算机网络
    • 说一下知道的状态码,200是什么,重定向是什么,它的过程是什么,如果重定向的话那么网页b是如何获取客户端信息的呢?
    • TCP和UDP区别
    • 为什么TCP更可靠
    • TCP三次握手四次挥手,为什么要三次握手四次挥手
    • HTTP是基于TCP的吗,HTTPS七次握手,七次握手中什么时候是对称加密什么时候是非对称加密,最后握手结束之后采用什么加密
    • 将url输入到浏览器中会发生什么?
  • 4.数据库
    • 索引是怎么实现的,如果让你来设计你会怎么实现,哈希表会出现什么错误,那用哈希表如果我要求一个范围的值会怎么办,复杂度岂不是很高
    • 事务的隔离等级
      • 读未提交、读提交、可重复读、串行化
    • 脏读、不可重复读、幻读
  • 5.操作系统
    • 进程和线程区别, 为什么进程切换开销大
      • 进程得去切换环境,例如全局变量、打开的文件
    • 进程间通信有什么方式,详细展开说怎么通信
      • 共享内存、管道、信号、消息队列、socket套接字
    • 共享内存是并发安全的吗,如何加锁
    • 管道两端可以互传数据吗
      • 不可以,默认的pipe有固定的传入端和传出端
  • 6.算法题
    • 找出第k个大的数,时间复杂度n
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      //快速
      //原理是在递归排序时,只递归包含目标下标的那一半
      //因此最后可将nlogn复杂度降为n
      int targetIndex = 0;
      int findKthLargest(vector<int>& nums, int k) {
      targetIndex = nums.size()-k;
      fastSort(nums, 0, nums.size()-1);

      return nums[targetIndex];
      }

      void fastSort(vector<int>& nums, int left, int right){
      int base = nums[left];

      int i = left, j = right;
      while(i < j){
      while(i < j && nums[j] >= base) j--;
      while(i < j && nums[i] <= base) i++;

      if(i < j){
      swap(nums[i], nums[j]);
      }
      }

      swap(nums[left], nums[j]);
      if(j == targetIndex) return;
      else if(j > targetIndex) fastSort(nums, left, j-1);
      else if(j < targetIndex) fastSort(nums, j+1, right);

      return;
      }
    • 顺时针遍历矩阵数组
  • 7.反问环节
    • 部门具体是做什么的
      • 答:就是后端的常规工作

一个小时。基础知识问挺细的,很多东西问具体的实现细节,数据库原理方面需要加强。算法题第一题实在想不出复杂度为n的解法,但是会问堆排序的复杂度是多少呢,第二题写完了但还没调完面试官就让说了思路。

本次面试发挥一般,需要改进的点有:

  • 语速放慢一些,思考之后再不急不缓说清楚
  • 引导问题有用上一些,下次继续
  • 做算法题时,可以多想想,不要图快紧张,建议将面试官摄像头关闭
  • 待补足的点
    • 操作系统的进程通信细节
    • select和epoll底层
    • 数据库原理(索引、引擎等)
      • mysql默认用MyIASM,写操作会上表锁,更大型的mysql用Innodb,支持事物、有ACID四大特征,还有四种隔离级别
      • 现在mysql都是默认用Innodb了
    • 计网http1.0、1.1等协议和状态码,重定向内容
      • http对TCP是无状态的,即用完就断,但是在1.1以后增加了一个keep-alive,在规定时间内再需要建立TCP通道的话就用老的通道,超过这个时间就关闭这个通道

面试5.05(海外tiktok广告部门)

  • 1.介绍一下自己
  • 2.项目
    • 你觉得在项目中的难点在哪里?
    • 那这种不同的数据结构问题,用大的来包括不行吗,比如统一有学院-入学年份-学历-专业-班级,博士没有专业就专业为null
      • 可以的,这也是一种实现思路,只是当时考虑到每个校友发布的信息,管理员要根据自己是否处于他的上级范围才能看到,如果采用这种方式的话可能在这一功能实现上查询开销会比较大
      • 并且管理员的页面需要展示所有组织架构,如果用这种来实现的话,需要去遍历整个学历表然后进行去重,考虑到每个用户都至少有有一个学历记录,开销会比较大。使用多叉树的话,能较少开销
  • 3.计算机网络
    • 介绍一下OSI七层模型
    • http和https的区别
      • 四次握手和七次握手,端口80和端口443,不安全和安全,不需要证书和需要到CA申请证书
    • https的七次握手
      • c->s:SYN
      • s->c:SYN+ACK
      • c->s:ACK
      • c->s:TLS版本号+加密套件列表+希望采取的TLS选项
      • s->c:加密套件+TLS选项+自己证书+公钥
      • c->s:自己证书+对称秘钥(用公钥加密)
      • s->c:FINISH
  • 4.数据库
    • 索引的实现方式有哪些
      • 哈希、b树、b+树
    • 索引用b树和b+树实现有什么区别,各自的优缺点是什么
      • b树会把节点分步在树中每个节点,而b+树只用叶子节点存数据,其他节点作索引辅助查找
  • 5.算法题
    • 给一个二叉树根节点root,给这棵树的所有节点加一个next指针用来指向它的同一层右侧节点
    • 给一个链表头节点,求倒数第k个节点
  • 6.sql题
    • 给两张表,求每个班级成绩前三名的学生
      • 表a:班级id,学号,学生姓名
      • 表b:学号,科目名,成绩
  • 反问环节:您觉得我还有哪些知识需要加强?
    • 答:挺好的,校招也不会问很细节的东西,如果要加强的话就去看看操作系统、计网和数据库原理这方面的基础和原理。

40分钟,面试官很nice,开头自我介绍他们部门都花了很长时间,对于语言不同不在意,说校招生进来学东西都很快。算法题有点过于简单了,可能是缺人?自己也不像之前那么急了,介绍的时候语速比较能控制。

  • 待补足的点
    • sql语法
    • 数据库原理(索引、引擎等)

二面5.07(海外tiktok广告部门)

  • 1.介绍一下自己,并问了实习时间和上海线上实习的问题
  • 2.项目
    • 这些项目选一个你觉得技术含量比较高的介绍
    • 那这个组织架构如果我采用一个用户对应多个学历记录为什么不可以
      • 可以的,但是在学历表里还是需要用多叉树的结构,因为校方的要求是学历的层级关系不能固定,要随时可以改动的,所以不能直接用一个列来作为某个学历层级,还是需要采取动态的结构
  • 3.计算机网络
    • OSI七层模型分别介绍一下各层
      • 应用、表示、会话、传输、网络、数据链路、物理
    • 除了分为七层还能分为哪几层 (五层和四层)
    • TCP为什么可靠,靠什么保证
  • 4.数据库
    • 什么是事务?
    • 详细介绍一下事务的ACID
    • 详细介绍一下四个隔离级别
    • 幻读是什么
      • 同一事务两次读的数据数量不一样,这是由于两次读的间隔中发生了插入、删除等操作,幻读是由当前读引起的,避免方法是加间隙锁,读数据的时候上间隙锁,禁止相关的插入、删除操作
    • 了解过索引的实现方式吗,说一说
    • 说一下B+树的优点
      • B+树相对于B树而言,数据全放在叶子节点且按顺序排列,叶子结点有next指针最底层可以看成是一个链表,这会使范围查找、排序查找变得异常简单
    • 主键索引和你自己创建的索引有区别吗
      • 主键索引是一种特殊的唯一索引
    • 说一下数据库里有哪几种锁,只有悲观锁和乐观锁吗?那你详细介绍一下这两种锁
      • 还有间隙锁,用来应对幻读的
  • 5.sql题
    • 给一张流水表
      • 求给定id和给定时间的流水和
      • 求给定时间段流水和超过10w的用户id
      • 如果该表仅用于查询客户某段时间的流水记录,怎样优化
        • 经提示是加与时间挂钩的索引
  • 6.算法题
    • 有一个random()函数,它以p概率返回0,以1-p概率返回1,请你自己构建一个函数使得返回0和1的概率相等
      1
      2
      3
      4
      5
      6
      7
      8
      9
      int i = random(), j = random();
      while(i+j != 1){
      i = random();
      j = random();
      }
      if(i == 1) return 0;
      else return 1;

      # 写出以上代码后问可以怎样优化,自己回答提出在while循环里剪枝,每次只重新计算一个数即可
  • 题外话:
    • 平时是怎么自学的,通过什么途径,为什么课堂上学习较少
    • 一天中大概会花多少时间自己学习
    • 除了学习之外还有什么爱好
  • 反问:您觉得我的数据库方面是不是有点薄弱,应该怎样增强
    • 理论和概念掌握得很好,实操上欠缺一些,建议可以对之前的项目进行优化,不是说满足客户要求即可,要去自己主动增进效率

50分钟。这次面试明显比上次难多了,主要针对的是数据库原理进行提问,后面的sql题也很难,算法题考察的也是数学而不是算法。

三面5.17(海外tiktok广告部门)

  • 实习时间大概多长?
  • 应该是24届毕业的吧,为什么这么早想出来实习?
  • 看简历上硕士是计算机专业的,本科也是吗?
  • 那是什么原因让你想转到计算机呢?
  • 看你简历上有两段实习经历,你认为这两段实习经历分别给你带来的最大收获是什么?
  • 除了上课,自己平时的学习方式是什么?
  • 反问:
    • 请问是入职后线下还是线上?
    • 大概什么时间能给一个反馈?

10分钟HR面。主要聊实习时间,薪资待遇(1.2w+线下1.5k房补),技术外的聊天。

5.18已Offer,5.25入职,感谢字节

7.网易-北京(C++开发)

网易互联网笔试4.16

  • 给一个数字n,输出用字符串画出n大小的O
    • 基础题,找规律构建输出字符串即可,没有难度,AC
  • 给一个数字n、k和x,要求构造一个长度为n,数字取值在[1,K]之间的数组和为x的数组
    • 33%通过,用了深度搜索,内存超限
  • 给一个节点值数组和边数组,在保持图内只有一个联通变量的情况下,删除边,得分为可删除边的两个节点乘积的末尾零个数,求最大得分
    • 0%通过,用了并查集,最后写出来了没时间调试
    • 正确解法:最小生成树(克鲁斯卡尔),+25分解
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      class UnionFind{
      private:
      vector<int> p;
      int cnt;
      public:
      UnionFind(int n){
      cnt = n;
      p.resize(n);
      for(int i = 0; i < n; i++) p[i] = i;
      }

      int find(int x){
      if(p[x] == x) return x;
      p[x] = find(p[x]);
      return p[x];
      }

      void connect(int x, int y){
      int rootX = find(x), rootY = find(y);
      if(rootX == rootY) return;
      p[rootX] = p[rootY];
      cnt--;
      return;
      }

      bool isConnected(int x, int y){
      int rootX = find(x), rootY = find(y);
      return rootX == rootY;
      }

      int count(){
      return cnt;
      }
      };

      int getValue(vector<int>& node, int x, int y);
      int main(){
      int nodeNum = 0, sideNum = 0;
      cin >> nodeNum >> sideNum;

      vector<int> node(nodeNum);
      for(int i = 0; i < nodeNum; i++){
      cin >> node[i];
      }

      UnionFind cache = UnionFind(nodeNum);

      vector<vector<int>> side(sideNum, vector<int> (3));
      for(int i = 0; i < sideNum; i++){
      cin >> side[i][0] >> side[i][1];
      int value = getValue(node, side[i][0], side[i][1]);
      side[i][2] = value;
      }

      sort(side.begin(), side.end(), [](auto& a, auto& b){
      return a[2] < b[2];
      });

      int ans = 0;
      for(int i = 0; i < side.size(); i++){
      if(cache.isConnected(side[i][0]-1, side[i][1]-1)) continue;

      cache.connect(side[i][0]-1, side[i][1]-1);
      if(cache.count() == 1){
      for(int j = i+1; j < side.size(); j++){
      ans += side[j][2];
      }
      cout << ans << endl;
      return 0;
      }
      }

      cout << "no" << endl;
      return 0;
      }

      int getValue(vector<int>& node, int x, int y){
      int ans = 0;
      int res = node[x-1] * node[y-1];
      string str = to_string(res);
      for(int j = str.size()-1; j >= 0; j--){
      if(str[j] != '0') break;
      ans++;
      }

      return ans;
      }


  • 给一个num数组,求num里面所有组合方式乘积的得分总和,得分为点乘积的末尾零个数,例如[10,5,10]就是,[10]+[5]+[10]+[10*5]+[10*5*10]+[5*10]
    • 0%通过,就是枚举法,但是测试用例通过了提交还是0通过,不知道是不是机试中途出了问题的原因
    • 正确解法:前缀积,其实和我写的差不多
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      int getValue(int res);
      int main(){
      int n = 0;
      cin >> n;
      vector<int> num(n);
      for(int i = 0; i < n; i++) cin >> num[i];

      int ans = 0;
      for(int i = 0; i < num.size(); i++){
      int temple = num[i];
      ans += getValue(temple);
      for(int j = i+1; j < num.size(); j++){
      temple *= num[j];
      ans += getValue(temple);
      }

      }

      cout << ans << endl;

      return 0;
      }

      int getValue(int res){
      int ans = 0;
      string str = to_string(res);
      for(int j = str.size()-1; j >= 0; j--){
      if(str[j] != '0') break;
      ans++;
      }
      return ans;
      }
  • 附加题:有1T大小的数据,数据每行是搜索关键词记录,当前电脑内存大小只有10GB,如何得到出现次数TOP10的关键词列表
    • 先按ASCII码排序,然后遍历,过程中每换一个新关键词就把其和出现次数加入大根堆
    • 大根堆pair<int,int>,当大小超过10时,pop()

网易互联网笔试4.21

  • 给一个数字n,用字符串画一个n大小的风车
    • ac,比较麻烦,硬写出来的
  • 给一个数组、一个数字p和一个数字x,你可以改变数组中一个数字(最大为p,不能不改),求是x的整数倍的可能数
    • 33.8%
  • 给一组有向边,你可以选择将其中一条有向边变成无向边,求从1到n的最短距离
    • 0%,典型的图
  • 三维立体魔方,每轮对其一些方块进行染色,请输出每轮的连通量数目(没记全)
    • 0%
  • 附加题:有10亿个数字,如何快速找出最大的N个数字。请分别给出单核解决方案和多核解决方案

网易雷火游戏笔试4.23

  • 1.六宫格数独
    • ac
  • 2.游戏题,有n个技能,boss有血量上限和虚弱上限、虚弱下线,求最少放几次技能可以使boss进入虚弱状态
    • 98.24%,简单的背包问题dp[i][j] = max(dp[i][j], dp[i][j-skills[i-1]]+1);
  • 3.字符串处理题,给函数和十六进制字符串,要求根据规则输出十六进制字符串调用的函数名和传参
    • 3.33%,写出来了没问题,最后卡在十六进制表示负数这一点上
    • 十六进制表示负数,先将符号位置F,然后对每一位十六进制数先转成二进制,二进制取反后得到的数再转成十六进制,最后再在末尾加1
  • 4.根据关键字和and、or对玩家问题进行匹配,然后输出规则里的答案,和华为机试题差不多,但是增加了and、or和()来加大难度
    • 0%,没时间写