阿里本地生活暑期开发实习(1面+2面+3面,凉)
其实已经面了挺了久了,一面是4.23,当时还没笔试,突然接到一面电话,就和面试官说我还没笔试呢,怎么就一面了,我说我还没准备好,面试官来了一句,不让你准备,现在开始,我说那好吧。二面是5.1晚上,对,没错,一号的晚上,当时正在电影院看柯南,突然接到面视电话,就在电影院面了。二面结束后到现在一直没有消息,本来想面完写个完整的面经,系统里也是一直正在面视的状态,不知道为啥,大概是凉了。三面是5.14号,项目部分答的不好,系统里已结束。
一面:
- 为什么数据库中用B+树作为索引而不使用hash表
- 如何判断一个链表中是否有环形结构
- 数组和链表的性能分析
- 青蛙跳台阶问题:一开始答了一维的动态规划,没想到面试官是想让我答斐波那契数列数列通项
二面:
- 数据库索引的作用以及优缺点
- satics关键字的作用,JAVA中satics关键字和private关键字能否被重写
- 方法覆盖和重载的区别
- 抽象类和接口的区别
- hascode和equals方法的重要性
- 开启线程的方法
- 索引B+树的数据结构
- concurrentHasMap JDK1.7和JDK1.8的取别还有锁粒度
- 为什么判断链表有环的过程中快指针要取为1,可以取其他值吗?一定会相遇吗?
- 判断一个数是否为质数?为什么遍历的过程的上限是开方
- 项目中发帖的过程
- 项目中对帖子的循环引用回复怎么实现
- 热帖的实现过程
- 如何集中删除某部分热帖(比如针对某个地点)
- 帖子中的表情该怎么实现
加试题:给你一个长度为N的链表。N很大,但你不知道N有多大,你的任务是从这N个元素中随机取出K个元素。你只能遍历整个链表一次,你的算法必须保证取出的元素恰好有k个,且它们是完全随机的(出现的概率相等)
后面网上查了好久没有直接的答案,这里贴一下我的做法吧:
import java.util.*; public class Solution{ public int[] Main(ListNode root,int k) { //先接受前k个杨素 int[] samples[]=new int[k]; Node temp=root; for(int i=0;i<k;i++) { samples[i]=temp.val; temp=temp.next; } //记录元素的下标值 int p=k; //生成随机数 Random random=new Random(); int j; //开始处理 while(temp!=null) { j=random.nextInt(p+1); //如果得到的随机数小于k,则接受这个数 if(j<k) { samples[j]=temp.val; } temp=temp.next; //索引要++ p++; } return samples; } } }