这是我的第一场面试,面试之前一直贼紧张,因为不知道面试具体是怎么样的

不知道面试官会不会很严肃或者会不会是压力面之类的

不过这一次面试,体验还是很不错的,就整场下来还算可以吧

感觉就像你朋友在你对面问你问题然后你回答的那种氛围

周五(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的时候,就减掉左指针当前的值....之类的话

然后面试官不满意,就说要我证明为什么减掉或者增加数据不会漏掉正确的答案之类的,我真的不知道怎么说哈哈哈哈(心想:呜呜呜呜别骂了别骂了,我就只会写代码,我是菜鸡)总感觉面试官觉得我没有自己的思考,只是单纯的背答案(但是我真的不知道怎么讲哈哈哈哈哈)

然后看完第三题的代码之后,问了一下数组里面存的是什么,我就说是头节点,用来处理冲突的时候,做成链表