阿里本地生活暑期开发实习(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;
}
}
} 

