0%

自我介绍

N个文件, 每个文件有序, 怎么合并成一个整体有序的文件? 时间空间复杂度是多少? (外部排序)

如何设计一个整数压缩算法? 一个整数数组, 用尽可能小的空间存放, 并且可以压缩完之后可以还原. (这个应该有专门的整数压缩算法, 但我不知道, 用之前学的霍夫曼编码构造了一下)

讲讲进程间通讯和线程间通讯的方法?

编程题,

1
用数组实现队列
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
class Queue{
private:
int values[];
int begin;
int end;
int size;
public:
Queue(int n){
++n;
values = new int[n];
size = n;
begin = 0;
end = 0;
}
~Queue(){
delete[] values;
}

void push_back(int a){
if(end == (begin - 1) % size){
throw new Exception("FullQueue");
}
else{
end = (end + 1) % size;
values[end] = a;
}
}

int pop_front(){
if(end == begin){
throw new Exception("EmptyQueue");
}
else{
int ret = values[begin];
begin = (begin + 1) % size;
return ret;
}
}

}

首先面试官竟然先自我介绍起来了, 介绍了组内的业务和技术栈

随后问了些实习的问题

给你一整年的关键词的数据, 关键词可以被视作字符串, 一天大概50亿条. 存储在100台机器上, 求top100频率最高的字符串

(我的思路是每台机器先map成关键词到频率的字符串, 然后相同的关键词shuffle到同一台机器上, 再reduce. 最后每台机器上取top100, 汇总到一台机器上是1w个最后再取整体的top100)

面试官问, 假如有一些关键词要被视为同一个关键词呢? 比如”北京鲜花”和”鲜花北京”或”土豆”和”马铃薯”这样的算一个关键词, 这样该怎么计算呢?

你刚才讲的1w个里面取前top100, 那该怎么做呢? (优先队列)

那如果存在并列的情况呢? 比如 1,2,….,99, 100, 100, 100, 101 的top100就是[1,2,....,99, 100, 100, 100]这102个元素.(我一开始答得是排序, 但是很慢, 后来想出来了, 还是用优先队列, top100是100, 那么我记录下这个100, 再把数组中所有的100添加到top里面)

java一个进程不同线程的栈是共享的吗, 栈里面存储哪些数据?

编程题,

1
2
3
15分钟自己实现优先队列的push和pop方法并且实现n个里面选前k个最大
我感觉就是在为难我, 还说阿里的笔试我做的不好, 美名其曰考察我的代码能力, 我感觉就是人招满了, 找个借口拒绝我
写的一般吧, 代码里还是有些问题的
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
class Heap{
Pair[] values = new Pair[n];
int size = 0;
void push(Pair pair){
values[++size] = pair;
int i = size;
Pair parent = values[i/2];
while(i / 2 > 0){
if(values[i].second < parent.second){
Pair tmp = values[i/2];
value[i/2] = value[i];
value[i] = tmp;
i = i / 2;
}
else{
break;
}
}
}

Pair pop(){
Pair ret = values[1];
values[1] = values[size];
//values[size] = null 这里忘记清空了
--size;
int i = 1;
while(i * 2 <= size){
Pair left = values[i * 2];
Pair right = values[i * 2 + 1];
if(right == null){
if(values[i].second > left.second){
Pair tmp = values[i];
values[i] = left;
values[i * 2] = tmp;
// i = i * 2 这里忘记更新i了
}
else{
break;
}
}
else{
if(values[i].second > Math.min(left.second, right.second)){
if(left.second > right.second){
Pair tmp = values[i];
values[i] = right;
values[i * 2 + 1] = tmp;
// i = i * 2 + 1 这里忘记更新i了
}
else{
Pair tmp = values[i];
values[i] = left;
values[i * 2] = tmp;
// i = i * 2 这里忘记更新i了
}
}
else{
break;
}
}
}
return ret;
}
}


List<Pair> topK(List<Pair> pairs, int k){
Heap heap = makeHeap();
for(Pair pair : pairs){
if(heap.size < k){
heap.push(pair);
}
else{
Pair top = heap.top();
if(top.second < pair.second){
heap.pop();
heap.push(pair);
}
}
}
return new ArrayList<Pair>(heap);
}

  1. 自我介绍
  2. 大数据开发的话喜欢是以平台为主还是以业务为主呢?
  3. 讲一下数据仓库分层? (又问到了这个问题, 我还是不会)
  4. 实习的过程中数据量有多大?
  5. 为什么中间数据要存到mysql中?
  6. 你做的这个报表分哪些维度?
  7. 底层的hive表是按照什么存储的呢?
  8. 只有10G的内存可用, 但是有200G的url数据, 怎么选出top10出现次数最多的url?
  9. 你简历上写的这些是学校里的课程吗? 还是自己学的?
  10. 自己学的过程中出现不明白的问题怎么解决的呢?

2021.05.09 更新

不知道为什么,竟然挂了, 可能是知道我有更好的offer了, 还是有更好的人选了? 感觉答的也可以啊

首先还是自我介绍, 介绍了项目和实习

你们这个实习数据量多大? 只负责的离线计算吗? 有没有做实时计算?

说一下HashMap和Hashtable区别?

介绍下java里优先队列的实现?

说一下使用线程池的好处?

在你的项目里怎么确定的线程池的参数?

你的项目里提到爬虫, 爬取的过程中怎么避免爬取重复的URL的问题呢? 用集合来存储

如果是定时爬取的话, 怎样设置集合中URL的过期时间呢?

了解redis删除过期的key的原理吗? 不了解, 蒙了一个不知道对不对

降价通知功能中每个股票对应的list是遍历一遍来扫描的吗?

为什么订阅后只发布一次通知, 如果用户想自定义发送通知的次数和步长, 和过期时间, 你应该怎么设计? (这个太难了, 不得不说阿里的面试官水平是真的高, 几分钟的交流就已经了解我做的项目的原理了, 并且发现了不足的地方)

jvm有了解吗? 讲讲类加载的机制吧

说一下java进程的几个状态?

说一下java多线程的关键字?

说一下synchronized原理?

写个题吧

阅读全文 »

自我介绍? 项目和实习?

为什么要做这个项目, 动机是什么?

本科和硕士学过什么课程呢?

讲讲实习主要做了哪些工作, 负责什么?

你实习写的这个监控是高可用的吗? (就一台服务器哪来的高可用, 垃圾netease)

实习的时候有mentor吗, mentor主要负责什么?

学过编译原理吗? 讲一下源代码到可执行文件的一些过程?

讲一下编译原理里面的优化? (本地相关优化, 本地无关优化)

学过汇编语言吗? 讲一下函数调用的时候栈帧是怎么变化的? (这我之前看过, 看懂过, 但是很难, 而且很快就忘了)

函数参数压栈的时候是从左到右还是从右到左? (应该是从右到左, 我答错了呜呜呜)

阅读全文 »

  1. 自我介绍
  2. 介绍下计算广告的一些基本知识, (因为做的实习是关于计算广告的, 所以问了一些). 介绍下竞价广告的主要流程
  3. 讲一下数据仓库分层?
  4. 平常数据都会存放在哪里? hdfs上吗?
  5. 你在实习中都参与了哪些工作呢, 处理那些数据?
  6. 点击率和转化率的计算公式?
  7. 转换类型有哪些?
  8. java 8种基本数据类型? 各占几个字节?
  9. 抽象类和接口区别?
  10. 抽象类和接口的作用有什么区别呢?
  11. java可以多继承吗?
  12. 说一下java里的主要集合有哪些?
  13. 刚才你说到HashMap, 那你讲讲HashMap和Hashtable的区别吧
  14. java创建线程的几种方式?
  15. 给你一张(学生id,考试成绩)的表和所有学生成绩的表, 求出所有学生的考试成绩. 没参加考试的用0代替
阅读全文 »

没自我介绍, 感觉这个面试官不太和蔼的样子, 非常严肃, 上来就直接问

volatile关键字讲一下

threadlocal讲一下, 里面的hashmap对应的key应该是线程对象而不是线程的id

说一下垃圾回收算法(标记算法和引用计数算法)

说一下引用计数算法, 这里一开始没明白面试官的意思, 后来才知道问的是三色标记算法.

说一下CMS收集器的四个过程.

说一下JVM锁膨胀的过程? 无锁, 偏向锁, 轻量级锁, 重量级锁

说一下java里面的四种引用, 分别有什么作用? 我只知道弱引用在WeakHashMap里有点用.

问了个jvm的题

阅读全文 »

  1. 自我介绍

  2. 平常开发过程中使用什么语言?

  3. 为什么选择java作为自己的开发语言?

  4. 说说java和c++的区别?

  5. 你刚才提到了c++的智能指针, 说一说智能指针的作用?

  6. 平常都使用什么数据库呢?

  7. 为什么使用MySQL?

  8. 你刚才说到Maria DB是仿照的MySQL? 那么这样做会产生产权问题吗?

  9. Maria DB和MySQL有什么不一样的地方呢?

    1
    2
    面试也是半小时就结束了,很快
    希望能过吧.

  1. 自我介绍
  2. c++用的多吗? (后来才知道组里主要用c++开发的)
  3. 说说hive和mysql有什么区别? 应用场景有什么区别? hive和mysql在执行SQL的时候流程上有什么区别?
  4. 数据倾斜了解吗? 解释一下
  5. hdfs上的有哪些压缩格式? 说一说他们的区别. (我只用过lzo压缩, 并且不知道原理)
  6. hive会把所有的SQL都转化为mapreduce吗? (这里感觉面试官觉得我hive掌握的一般, 就没接着问下去了)
  7. 说一下mysql 聚集索引和非聚集索引区别?
  8. 哪些情况下使用聚集索引效率高, 哪些情况下使用非聚集索引比较高?
  9. 讲一讲联合索引最左结合的规则吧
  10. 假如有一个联合索引(a, b), where条件里面写成b = value_b and a = value_a这样可以走联合索引吗? (之前没考虑过这个问题, 但是肯定能啊, 假如这点都做不到也太不智能了吧)
  11. 说说jdk1.7和jdk1.8里面的ConcurrentHashMap结构有什么区别?
  12. 说说ConcurrentHashMap里面的加锁类型有哪些?
  13. 讲一讲CAS的原理?
  14. 说一说使用线程池带来的优点? (线程复用, 方便管理)
  15. 你刚才说到了创建和销毁线程的开销很大, 那你来说说开销都花费在了什么地方? 这里我只回答了系统调用产生的开销和内存分配产生的开销.
  16. 你刚才说到了内存分配, 具体分配了哪些内存呢? (线程控制块, 栈内存)
  17. 你刚才说到了线程控制块, 这个数据结构存放在哪里呢? (我回答的是存储在进程的文本区里, 后面听录音才发现错了, 当时脑子真的抽风了, 明显应该是分配在OS的内核空间里的啊, 这个错误犯的太低级了!)
  18. redis为什么采用单线程? (CPU不是瓶颈)
  19. 你刚才说到执行bgsave命令的时候redis不是单进程, 他创造出来的子进程也是用fork创建的吗?
  20. 说一下redis 分布式锁? (set nx ex ,redlock)
  21. 讲讲c++多态实现原理?
阅读全文 »

1 自我介绍

2 问实习能实习多久

3 mysql b+树和b树区别, 你刚才说了b+树的优势, b树就没有优势吗?

4 说说spark的架构和任务提交的流程.

5 TCP是怎样实现可靠性的? 除了超时重传还有哪些机制?

6 做个编程题吧

阅读全文 »