阿里国际化中台校园招聘-研发工程师JAVA-面经

面试流程

阿里的面试持续了1月左右,一共四轮,十分漫长。校招投递时间3月中旬,期间因为有考试麻烦了考官帮我延期3周,如果按照正常进度一周一面的话应该4月初结束。

一面(电话面)→笔试(在线测试)→二面(电话面)→三面(电话面)→四面(视频面)

一面

1小时,在笔试之前先面试是万万没想到的,可能因为是内推

问题:

  1. 自我介绍

  2. 描述TCP和UDP区别

  3. 进程和线程区别

  4. java内线程通信如何实现

  5. 能讲一下数据库索引吗

  6. 讲一下JVM虚拟机

  7. 两道算法题,用阿里的伯乐系统在线做

    • 7-1 找一棵树中距离最远的两点距离
    • 7-2 给你n个数,表示一列并排的矩形,他们的宽度为1,高度为第i个数的值。问这堆矩形能形成的最大长方形面积

笔试

1小时,两道算法题

  1. 忘记了,用到了栈
  2. 一棵带边权的树,三个人每个人都有几个中意的点,在中意的点中居住的概率相同,三个人会选择距离和最近的点集合,问期望路程是多少。数据范围树的点数n<2e5,偏好酒店个数k<n, 时限3s。

二面

  1. 自我介绍
  2. 做过的项目介绍,会问简历中具体做过项目的细节,详细到你的思路,建模过程,实现过程中的难点
  3. 有什么你在简历中没写的吗?会根据回答具体讨论,关于我的回答问题是
    • 3-1 产品经理需要有什么特质
    • 3-2 如果开发一款创新性的产品,例如发明微信,需要具备什么产品思维
  4. JAVA的基本变量类型
  5. TCP协议和IP协议的区别
  6. 应用层有哪些协议

三面

  1. 自我介绍
  2. 职业规划
  3. 数据库事务
  4. 数据库的并发一致性问题,例如丢失修改,读脏数据,不可重复读,幻影读
  5. 你本科最擅长的科目?根据回答会问相应问题,我回答了操作系统和数据结构,接下来用在线评测系统写代码
    • 5-1 实现生产者消费者
    • 5-2 每步可以走1 或 2 级台阶,有 n个台阶,问多少种走法

四面

  1. 自我介绍
  2. 根据简历项目,询问项目细节
  3. 大学中做过的这些项目,印象最深刻的是,代表性的开发作品,锻炼了你什么
  4. 解决一个问题,如何实现:淘宝中有很多商品,有些商品会被经常访问,就把他放到缓存中而不是数据库中,但是商品很多,如何决定把哪些商品放在缓存中?
  5. 英文自我介绍
  6. 英文3年职业规划

答案

答案是根据自己学的回答的,不是一定的标准答案,各种项目细节更是仅供参考描述。

写答案的主要原因是因为我在准备的过程中,参考了大量开源社区的整理,还有b站up主的视频,所以希望自己也能够帮到别人。

一面

  1. 自我介绍

  2. 描述TCP和UDP区别

    • 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
    • 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
  3. 进程/线程/协程区别

    进程是资源管理单位,线程程序执行单位(这个执行程序是指kernel thread,才能真正的去执行程序,应用程序的thread和kernel thread 存在映射关系)为了提高routine切换成本比较低,协程是routine的一种实现

    Ⅰ 拥有资源

    进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

    Ⅱ 调度

    线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。

    Ⅲ 系统开销

    由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

    Ⅳ 通信方面

    线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。

  4. java内线程通信如何实现

    多种方法,详情见:https://redspider.gitbook.io/concurrent/di-yi-pian-ji-chu-pian/5

    利用锁与同步、等待通知机制、信号量、管道和其他方法等

  5. 能讲一下数据库索引吗

    索引是加快了查询。

    数据库的索引实现是数据结构b+ 树。b+树非叶子结点不存储data,只存储索引,可以存放更多的索引叶子结点包含所有索引字段叶子结点用指针连接,提高区间访问的性能。

    innodb的索引是聚簇索引,主索引的叶子节点 data 域记录着完整的数据记录,这种索引方式被称为聚簇索引。因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。辅助索引的叶子节点的 data 域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找。

image1

MyISAM是非聚簇索引,叶子节点上不存储数据。

关于联合索引,要注意建立索引时遵循左匹配原理。将区分度高的字段放在前面,区分度低的字段放后面。像性别、状态这种字段区分度就很低,我们一般放后面。

  1. 讲一下JVM虚拟机

    java成为跨平台语言的关键

    所有线程共享的部分有:java堆,方法区

    每个线程私有的是:pc寄存器,java虚拟机栈,本地方法栈

    各部分的功能详情见:

    链接

  1. 两道算法题,用阿里的伯乐系统在线做

    • 7-1 找一棵树中距离最远的两点距离

      dfs。

      方法一:对每个结点,维护子节点的最长链和次长链,最远点的距离就是对某个结点的最长链+次长链长度

      方法二:实际上是求树的直径。第一遍dfs找到最远点,然后把这个结点作为根节点再跑一次dfs找到最远点。两次找到的点都是直径的端点

    • 7-2 给你n个数,表示一列并排的矩形,他们的宽度为1,高度为第i个数的值。问这堆矩形能形成的最大长方形面积

      暴力想法:我们肯定对每个高度,都尽量找它向左和向右最远到哪

      可以用高度递增的栈维护上面的边界,记录结点的位置和高度,栈中保证结点高度是非递减的,这样每当一个新节点加入时,栈内的点如果高度小于等于它就压进去,大于它的话就把栈顶弹(hi,xi)掉。弹掉时维护答案,它的高度*(当前要加入栈数位置-它栈下一个数的位置)

笔试

1小时,两道算法题

  1. 简单题,忘记了,用到了栈

  2. 一棵带边权的树,三个人每个人都有几个中意的点,在中意的点中居住的概率相同,三个人会选择距离和最近的点集合,问期望路程是多少。数据范围树的点数n<2e5,偏好酒店个数k<n, 时限3s。

    一条边对答案的贡献是他左右两边的不同人的方案数, 因为这条边必须被经过才能在这些选点方式中将三个点连通 且三个点连通的最短情况下每条路径上的边只会被经过一次

    核心代码

    1
    2
    3
    4
    5
    6
    tmp=cou[v][1]*(num[2]-cou[v][2])*(num[3]-cou[v][3]);
    tmp+=cou[v][2]*(num[1]-cou[v][1])*(num[3]-cou[v][3]);
    tmp+=cou[v][3]*(num[2]-cou[v][2])*(num[1]-cou[v][1]);
    tmp+=cou[v][2]*cou[v][3]*(num[1]-cou[v][1]);
    tmp+=cou[v][1]*cou[v][3]*(num[2]-cou[v][2]);
    tmp+=cou[v][1]*cou[v][2]*(num[3]-cou[v][3]);

二面

  1. 自我介绍

  2. 做过的项目介绍,会问简历中具体做过项目的细节,详细到你的思路,建模过程,实现过程中的难点

  3. 有什么你在简历中没写的吗?会根据回答具体讨论,关于我的回答问题是

    • 3-1 产品经理需要有什么特质
    • 3-2 如果开发一款创新性的产品,例如发明微信,需要具备什么产品思维
  4. JAVA的基本变量类型

    • byte/8
    • char/16
    • short/16
    • int/32
    • float/32
    • long/64
    • double/64
    • boolean/~
  5. TCP协议和IP协议的区别

    tcp是运输层协议,IP是网络层协议。

    运输层是解决进程之间基于网络的通信问题,是端到端通信。

    网络层是解决分组在多个网络上传输的问题

  6. 应用层有哪些协议

    https、ftp、smtp等

三面

  1. 自我介绍

  2. 职业规划

  3. 数据库事务

    事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。

    • 1.数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的整体。
    • 2.构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。
    • 3.构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态。
    • 4.以上即使在数据库出现故障以及并发事务存在的情况下依然成立。

    例如:

    1
    2
    3
    4
    >BEGIN TRANSACTION 
    >A账户减少100元
    >B账户增加100元
    >COMMIT

    事务使系统能够更方便的进行故障恢复以及并发控制,从而保证数据库状态的一致性。

  4. 数据库的并发一致性问题,例如丢失修改,读脏数据,不可重复读,幻影读

  5. 你本科最擅长的科目?根据回答会问相应问题,我回答了操作系统和数据结构,接下来用在线评测系统写代码

    • 5-1 实现生产者消费者。是多线程通信的例子

    • 链接

      哎。当时没写出来,好难啊。先鸽了,以后补上!

    • 5-2 每步可以走1 或 2 级台阶,有 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
      32
      33
      34
      35
      36
      //问题:每步可以走1 或 2 级台阶,有 n个台阶,问多少种走法
      #include<iostream>
      #include<cstdio>
      using namespace std;
      const int maxn=10000;
      //总方案数
      int tot = 0;
      //方案记录数组
      int v[maxn],num;
      void dfs(int cou){
      if(cou == n){
      //输出方案
      //总方案数+1
      tot++;
      printf("现在是第%d 种方案,走法是:",tot);
      for(int i = 1;i <= num;i++)printf("%d ",v[i]);
      cout<<endl;
      return ;
      }
      //不能构成方案,返回
      if(cou > n)return;
      //这一步走一级台阶
      v[++num]=1;
      dfs(cou+1);
      //回溯
      num--;
      //这一步走两级台阶
      v[++num]=2;
      dfs(cou+2);
      num--;
      }
      int main(){
      dfs(0);
      //输出总方案数
      cout<<tot<<endl;
      }

四面

  1. 自我介绍
  2. 根据简历项目,询问项目细节

化学建筑项目。

光能转化模型

  1. 太阳能电池最佳倾角
  2. 向光材料接受率分析
  3. 编程原理

问了模型设计的难点,考虑将建模与AI结合,创新点,学到了什么,建模过程

  1. 大学中做过的这些项目,印象最深刻的是,代表性的开发作品,锻炼了你什么

产品经理

微北洋,轻北洋。设计的特点,两者区别。

产品的创新点!突出特点

定位

  1. 解决一个问题,如何实现:淘宝中有很多商品,有些商品会被经常访问,就把他放到缓存中而不是数据库中,但是商品很多,如何决定把哪些商品放在缓存中?

    实际是缓存淘汰算法

    1.LRU 最近最久未使用

    LRU 近最久未使用的页面换出。

    第一种实现方式直接用链表。 当一个页面被访问时,将这个页面移到链表表头。但是每次都要遍历链表,代价较高。

    第二种实现方式hashmap+链表。查询数据是否在链表中用hashmap。当需要插入新的数据项的时候,如果新数据项在链表中存在(命中),则把该节点移到链表头部,如果不存在,则新建一个节点,放到链表头部,若缓存满了,则把链表最后一个节点删除即可。在访问数据的时候,如果数据项在链表中存在,则把该节点移到链表头部,否则返回-1。这样一来在链表尾部的节点就是最近最久未访问的数据项。

    1. NRU 最近未使用

    两个标记R/M。R标记被访问,M标记被修改。R位会定时清零。页面分为4类:

    R=0, M=0

    R=0, M=1

    R=1, M=0

    R=1, M=1

    发生缺页中断,随机从编号最小的非空类中选一个页面换出。

    NRU优先换出已被修改的脏页面(R=0,M=1),而不是被频繁使用的干净页面(R=1,M=0)

  2. 英文自我介绍

  3. 英文3年职业规划

感受

第一面是最懵逼的,因为是第一次投实习,第一次面试,根本不知道还有面经这种东西存在。没有准备,以为凭着本科所学直接上,实际上证明了——我本科什么都没有学的深入,或者说没学到能记住细节,几乎所有被问的问题都是对这个问题在哪堂课见过有个印象,但是答不上来,万幸的是面试官见我基础太差就直接开始考算法题。果然只有大学打过的acm印在了脑子里。基础太差又薄弱,也没有项目支撑。

还有阿里的面试官非常准时,一般跟你约好的时间会准时出现,后来我就在约好的时间提前半小时提前准备了。

第一面结束后很受挫,开始认真准备面试。大体分为三步:

1.基础知识学习。

2.看视频,理解技术细节。

3.刷面经,对着题目回答。

基础知识复习参考:

http://www.cyc2018.xyz/#%E7%AE%97%E6%B3%95

细节讲解,有很多不错的b站教程:

https://www.bilibili.com/video/BV1c4411d7jb?p=44&t=661

https://www.bilibili.com/video/BV14z4y1d7Wa?t=912

https://www.bilibili.com/video/BV1aE41117sk?p=8&t=1023

https://www.bilibili.com/video/BV1Wr4y1A7DS

面经:牛客网,很多面经。

https://www.nowcoder.com/discuss/620617?channel=-1&source_id=discuss_terminal_discuss_history_nctrack&ncTraceId=0de4c2957e304ce1b6b8fb84384fbd59.956.16182236949048605

复习了1周左右,难受的是感觉东西越学越多,java不咋会写,还要学spring框架,操作系统的算法看了就忘。期间收藏了不少好课,十足的好课,可惜我大学前两年学基础时没有干脆自己看网课学这些。例如湖科的b站计网课,还有清华向勇老师的操作系统,可惜当年不知道,想今年有机会把这些看完。

第二、三、四面都意识流偏多,考官很喜欢聊科研中的细节,因为2年产品经理,每个考官都有和我聊到产品,还有4场面试中,3场都有算法题,感谢大学加入了天外天和acm,大一不经意做出的选择悄然间改变了发展的轨迹。

参加实习面试的还有一件影响就是它让我开始回顾自己。一是,接受自己很菜的事实,从高中起身边就已经有了让我仰慕的学术idol,都是在自己领域做的闪闪发光的人,他们的很多博客,记录都有影响到我追着脚步一点点前进;二是,感谢和珍重曾经做的每一次选择,大一刚入学的时候真的很迷茫,那时候我甚至一口气在百团大战报过10个社团,我大概属于对自己的未来规划有方向,却对具体实施不太清醒的人,大二的时候才明白,重点在于做减法而不是做加法,做好一件事足矣,只留下了天外天和acm,回想9.1日开学喻老师把我们召集起来开始布置acm训练,和9.31日坐在天外天的面试官前什么都不懂的我,肯定不知道悄然改变了3年后的自己。

更希望在阿里做开发可以学到很多东西,希望明年想起来发现这一年学会了更多的东西!

好吧其实这一阵子焦虑的很。

hahah