2020腾讯暑期实习 后台开发岗 一面问题整理

记录人生第一次的面试,一场兵荒马乱的面试。

面试情况

2020腾讯暑期实习 成都 后台开发岗 一面凉经

计算机网络

1、TCP的流量控制(答得很差,等于没答上来)

操作系统

1、进程调度算法(没想起来) 2、进程通信(答了一部分,说的有点混乱,但是不懂面试官感觉如何。)

数据库

1、数据库 查询是如何执行的?(当时没懂问的是啥,直接说不太懂,后面想起来,用 Explain 命令可以分析mysql 复杂查询语句的执行过程,面试官应该问的是这个。) 2、三个范式的定义(说完了,但是不懂面试官感觉如何。) 3、Innodb与 Memchached 的比较(说完了,但是不懂面试官感觉如何。)

Python

1、List和Tuple的区别(没说上来) 2、copy 和 deepcopy 的区别是什么?(说完了,但是不懂面试官感觉如何。) 2、Python的垃圾回收机制(说完了,但是不懂面试官感觉如何。)

算法题

1、给定一个链表,其中存在着环,所谓环是指链表的结尾指向了链表中间的一个位置,要用最简单的方式找到链表的尾部的val以及指向的那个中间节点的val

实际上,这是一道LeetCode原题。

是middle难度的题,142. 环形链表 II

第一次面试,不太懂,问了半天,原来可以写伪代码。 我的方法,时间复杂度太大,面试官听了直接结束了面试。 (ó﹏ò。)

我的想法是遍历链表,将每个节点的值保存在一个 List 和一个 hash map 中,每次都判断,是否出现重复,如果重复已经出现,就说明找到了尾结点。但是这个方法时间复杂度至少在 \(O(n^2)\)\(O(n^3)\) 之间。

还是太年轻了呀 (ó﹏ò。)

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
def markStart(head):
tmp = []
hash_map = {}
p = head
is_first = True
start = None
end = None
# 先把结果保留下来
while not p:
tmp.append(p.val)
if p.val in hash_map:
hash_map[p.val] += 1
else:
hash_map[p.val] = 1
# 判断tmp中是否出现重复,如果重复已经出现,就说明找到了尾节点。
for i in hash_map:
if hash_map[i] > 1: # 重复出现
tmp_value = i
for j,v in enumerate(tmp):
if v == i:
if is_first:
start = j
is_first = False
else:
end = j
break

遇到链表,正确的做法是马上想到用指针, 先用两个指针,慢指针一次走一步,快指针一次走两步,它们若相遇一定在链表的循环中,然后另外一个指针从头开始走,慢指针也一步一步的走,若它们相遇,便是起始位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head == None or head.next == None:
return None

slow,fast,entry = head,head,head

while fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
if fast == slow:
while entry != slow:
# 每次都保留slow前面的那个节点,最后slow和entry相遇时,自然slow前面那个节点就是本来的exit。
exit = slow
entry = entry.next
slow = slow.next
return entry, exit # 分别是循环开始的地方和链表本来结束的地方
return None

这是面试结束之后整理的题解

面试总结

  • 计算机网络、操作系统、数据库的相关问题非常多,经过这次面试,我意识到,不仅要抓紧时间全部熟悉,也要抓紧时间反复练习如何把一个问题给面试官阐述清楚,这个也很重要。
  • 算法题要经常练习,经常回顾总结,每年一道新题,复习几道做过的题目,形成固定思维,什么时候用指针、什么时候用回溯法、什么时候用动态规划,都要非常清楚才行。
  • Python的一些基础特点,面试常问到的问题,一定要掌握,因为简历上的技术栈,只写了Python。
  • 最后就是,早睡早起,每晚睡觉时间不得晚于11点,这次面试,太困了。

准备总结

面试的问题非常多,不可能把每一个问题的细节都记清楚,所以对于常考的部分问题,如进程调度和通信、死锁、页面置换算法、三次握手四次挥手。

其实面试(开发 or 算法)准备是一个很矛盾的过程,个体整体之间本来就是存在关联关系的,不是独立存在的。

这些一个一个的知识点,如果只关注高频问题,那么对整体就不会有清晰完整的概念。但是,如果一味地、盲目地想搞懂每一个细节,又会让我们丢失重心,无法准确地把握关键。

最好的方案是: 1、对要复习的知识点整体有一个大概地认识,清楚总共有哪些知识点,其中哪些是重点知识点。 2、第一轮先广泛地涉猎,对每个知识点都有所了解,不求深度认知,但求有限认识且认识正确。 3、第二轮在第一轮的基础上,对重点知识点做全方位的了解。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!