上次挂了之后,我又来了。
头条这次很快,我一个下午就面完了 3 次技术面试。所以很多题都可能记混了。
一面
自我介绍…
你印象最深的一个项目
我说了自己的抢课脚本
类似这种脚本你觉得应该怎么写
我只写过这一个呀,不会,然后又问我就这个项目是怎么写的,我就说了下流程。
怎么不让服务器发现
伪造头部,操作频率不要太频繁,不会。
后端应该怎么判断爬虫
这个我也不了解,就说了下操作的频率,乱说,现在想起来应该有验证码的方法。。
前端如何判断
不会(我投的是后端。。不是爬虫,也不是前端
一道括号匹配的常规栈算法题,很水,但是我还是写错了。。
根据前序遍历和中序遍历还原二叉树,这个也很水。
就面完了。问我还有什么问题,我问我这两题做的怎么样(不知道问什么了
二面
自我介绍…
做过什么项目
实验室项目balabala
HTTP 状态码了解吗,503 知道吗
不知道(查了下,
Service Unavailable 服务不可用
那你了解多少
2XX 表示成功发起请求,3XX 表示重定向,比如 301,302,4XX 表示客户端错误,比如
404 Not Found
,403 Forbbiden
,5XX 表示服务器错误。CORS了解过吗
又是不是很懂,跨域限制
怎么发送跨域请求
服务器取消限制(瞎说开始
除了这个呢
不会了
HTTP 头部了解多少,说几个
Accept-*
,Cookie
,Cache-Control
,ETag
,Origin
,Referer
,每一个都随便解释一下,然后就想不起来其他的了,让面试官说几个我解释,他问了User-Agent
。说下段和页
页是定长的,段是不定长的,段是逻辑的,比如代码段,数据段。页是“比较物理”的(说的不准确)
怎么寻页和段
段不太记得了,页要根据地址映射找到
进程调度有什么算法
先到先服务,最短作业优先,最短剩余时间优先,优先级调度,轮转,多级队列反馈
怎么知道剩余时间
不会,印象中是有概率的
Redis 数据类型有哪些
string,set,list,zset,hash
Redis 的底层数据结构怎么实现的知道吗
不知道(之前收藏过了但是懒得看。。
算法题
给定整数数组 a,元素满足 1 <= a[i] <= n (n 为 a 的长度),有些元素出现一次,有些元素出现两次,找出所有出现两次的元素
问可不可以用变量,说不可以,问我用变量怎么做,我说可以哈希。我先想到的是先排序再遍历,时间复杂度是 $O(n\log n)$。问我有没有 $O(n)$ 的方法,想了半天没想到。面试官提示我可以改变数组的状态,恍然大悟,不过还是想偏了,又想了半天才想到解法:
1
2
3
4
5
6
7
8
9
10
11
12
13vector<int> findDuplicates(vector<int>& nums) {
int offset = nums.size();
vector<int> ans;
for (int i = 0; i < offset; ++i) {
int index = (nums[i] - 1) % offset;
if (nums[index] > offset) {
ans.push_back(index + 1);
} else {
nums[index] += offset;
}
}
return ans;
}链表题
有两条链表,它们可能在某一点交叉,找到这个交叉点
先问我这个形状是怎么样的,我不假思索先说了 X,然后反口说 Y。我又问可不可以用变量,依然不可以。他问如果可以的话怎么做,我又说哈希。
想了一会想了出来:先设两个链表指针指向两个链表,然后同时遍历链表,如果相遇直接返回,如果一个到尾部了,另一个还没有,则让没有到底的继续遍历,并记下走的步数
s
。s
则为两条链表交叉前的长度差,所以这时候再重新让两个指针指向链表头,并让长的那个先走s
步,再同时遍历链表,相遇则返回。时间复杂度是 $O(n)$。(代码丢了)
三面
自我介绍…
MySQL 索引原理
B+树,聚簇索引,辅助索引,哈希索引都说了下
给了道设计系统的题给我
订单系统设计
order_table
id, create_time, product_id, xxx, …
- 某一款产品所有的订单
- 某天所有订单
- 最近 n(n<30)天 某款产品 的所有订单
- SQL
- index
- 缓存设计
先写 SQL,特意问了下需要取出什么字段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
151.
SELECT *
FROM order_table
WHERE product_id = 1;
2.
SELECT *
FROM order_table
WHERE create_time BETWEEN NOW() AND DATE_SUB(NOW(), INTERVAL 1 DAY);
3.
SELECT *
FROM order_table
WHERE product_id = 1 AND create_time BETWEEN NOW() AND DATE_SUB(NOW(), INTERVAL 1 MONTH);索引的话,主键索引肯定有的,
(product_id, create_time)
建一个联合索引,经面试官提醒补充一个create_time
索引缓存的话用 Redis,因为不知道 Redis 可否遍历 key,如果可以的话可以直接存
product_id
作为key
,然后设过期时间(面试官直接 pass 这个方案)。不可以遍历的话,存一个 list,但是要每天更新。然后问我 key 怎么设计,我说<product_id>_1month
这样。Redis 的底层数据结构知道吗
跳表,字典什么的(二面结束后看了一下,还好没问细节
概率题:
100个旅客按顺序准备登机,每个人都拿着对应的座位票的number,第一个人因为喝醉了,他随机选一个座位,其他的旅客选择座位的规则是: 1. 如果他对应的座位没被坐就坐原来的 2. 如果被别人做了,他就随机从剩余的座位里选一个。
问第100个人坐到自己座位#100的概率是多少?
算了半天算不出来,提示可以从简单的归纳,还是不会,答案是 $1/2$
算法题:
输入
n
[…, (start_time_i, end_time_i), …]
timestamp int
条件:
- 选择听一场后必须全程参加
- 时间不能重叠
- 不考虑切换成本
问题:
实现一个算法,找出最多能听多少场演唱会
[(1, 3), (2, 4), (5, 6)]
=> 2
(做过),简单问了下可不可以边界重叠就开始做
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Cmp {
public:
static bool cmp(const pair<int, int> &l, const pair<int, int> &r) {
return l.second < r.second || (l.second == r.second && l.first < r.first);
}
};
int getTimes(vector<pair<int, int> > times) {
sort(times.begin(), times.end(), Cmp::cmp);
int end = -1;
int count = 0;
for (int i = 0; i < times.size(); ++i) {
if (times[i].first > end) {
end = times[i].second;
++count;
}
}
return count;
}cmp
函数都写错几次。。我的算法题没救了还有什么问题要问的吗
头条的技术栈是怎么样的(虽然知道是 python+go),然后我又问 python 的性能不会有问题吗(发出菜鸡的提问)
面试官突然想起来一样的问我 “我们北京也有设立总部,你有没有想法”
我觉得实习几个月不太想去那么远,连深圳都不太想去,想在广州(拒绝offer发言,别学)
感觉三面面的比较久,但是也想不起什么题目,先这样吧。
总结
算法太菜了,数学也不行,基础不扎实,扩展知识也不丰富,这都没挂。不过 3 次面试问了 5 道编程题我也是第一次见,虽然都挺水的。
评论