这是我的第一场面试,面试之前一直贼紧张,因为不知道面试具体是怎么样的
不知道面试官会不会很严肃或者会不会是压力面之类的
不过这一次面试,体验还是很不错的,就整场下来还算可以吧
感觉就像你朋友在你对面问你问题然后你回答的那种氛围
周五(3.19)收到面试官的电话约我 周一(3.21)晚上七点面试
约好之后发邮件给我,腾讯会议的
所以昨天提前十分钟就已经进入腾讯会议等面试官了(因为我太紧张了,太激动了处女面)
然后面试官开始的时候,先让我自我介绍,我介绍完之后,面试官也自我介绍了一下,顺便讲了一下他们部门主要做微信支付C++后台开发业务的?(听得不是很清楚,我记得我投的是PCG腾讯视频?不知道为啥来到了微信支付hhh)
然后面试官讲完之后,直接让我先做题,40分钟,4选2来做(12选一题,34选一题),可以用任意语言和任意你喜欢的编辑器
算法笔试题
要求:
1、语言不限
2、时间为40分钟
一、算法题(1/2题任选一题)
1、给定最长0xff字节的16进制数据,如unsigned char *hex = "0095AFF9F703A8"(最长可能100个字符) ,要求以10进制格式打印出该数值(要求用大数实现,不能用大数库函数,否则不得分,要求自己实现大数)。
2、小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
(要求实现的时间复杂度为O(N),例如输入100,那时间复杂度应该是100级别的)
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
def get_res(n):
left, right = 1, 1
res = []
count = 1
while right <= n-1:
if count < n:
right += 1
count += right
elif count > n:
count -= left
left += 1
else:
res.append([i for i in range(left, right+1)])
right += 1
count += right
print(res)
if __name__ == '__main__':
get_res(9)
二、数据结构(3/4任选一题)
3、用拉链法实现hash,接口:插入,查找,删除
hash函数,可以不实现
要求要用链表实现
class Node:
def __init__(self, key, val):
self.key = key
self.val = val
self.next = None
class HashMap:
def __init__(self, n):
# 数组大小和长度
self.table = []
self.length = n
for i in range(n):
# 初始化节点
self.table.append(Node(None, None))
def insert(self, k, v):
# 获取索引
index = k % self.length
# 获取链表
cur_list = self.table[index]
while cur_list:
# 如果找到旧值,更新
if cur_list.key == k:
old_val = cur_list.val
cur_list.val = v
return old_val
if cur_list.next is None:
break
cur_list = cur_list.next
# 如果找不到,插入到链尾
cur_list.next = Node(k, v)
return v
def search(self,k):
# 获取索引
index = k % self.length
# 获取链表
cur_list = self.table[index]
while cur_list:
# 如果找到
if cur_list.key == k:
old_val = cur_list.val
return old_val
cur_list = cur_list.next
# 找不到
return None
def delete(self,k):
# 获取索引
index = k % self.length
# 获取链表
pre = self.table[index]
cur = pre.next
while cur:
# 如果找到节点
if cur.key == k:
pre.next = cur.next
return cur.val
pre = cur
cur = cur.next
return None
if __name__ == '__main__':
hmap = HashMap(10)
hmap.insert(1,2)
hmap.insert(3,4)
res1 = hmap.search(1)
res3 = hmap.search(2)
print(res1,res3)
4、实现一个大根堆,两个过程:
a、构建堆
b、弹出堆顶数据
正好第一第四题不会,第二题好像在力扣做过,第三题,就模仿hashMap的操作来就行
三十几分钟才做好
然后面试官就开始看我的代码,问我是不是第二题做过,我说是,然后面试官说,做过没关系,然后就问我思路,要我证明我的代码为什么没有错,会不会漏掉数据(就证明你的代码是成立的),然后我懵逼了,我真不知道怎么说这个哈哈哈,我就说,左右指针之间的数组总和小于target的时候,就右指针往右移动,当和大于target的时候,就减掉左指针当前的值....之类的话
然后面试官不满意,就说要我证明为什么减掉或者增加数据不会漏掉正确的答案之类的,我真的不知道怎么说哈哈哈哈(心想:呜呜呜呜别骂了别骂了,我就只会写代码,我是菜鸡)总感觉面试官觉得我没有自己的思考,只是单纯的背答案(但是我真的不知道怎么讲哈哈哈哈哈)
然后看完第三题的代码之后,问了一下数组里面存的是什么,我就说是头节点,用来处理冲突的时候,做成链表