笔试

三道算法题,都还算简单。大概描述一下:

第一题:输入ABCD四个数,分别是平面两个点的横纵坐标,但不知道具体对应关系,例如可能是p1(A,B)和p2(C,D),也可能是p1(C,A)和p2(D,B)。求可能的两点距离平方最大值。

第二题:自己实现一个栈,输入可能是数字或者操作。如果是数字,压栈;如果是操作,按照操作说明进行计算。操作有:

  • POP 出栈一个数。
  • DUP 将栈顶的数拷贝一份放在栈顶
  • + 将栈顶两个数相加压回栈中
  • - 将栈顶两个数相减压回栈中

最后返回栈顶的元素。但凡任意一步中出现了大于2^20 - 1的结果,或者某个操作栈中元素数不足,则返回-1

第三题:给出若干平面上的点的坐标,写出有多少三元组在同一条直线上。也就是说有多少个三点共线的情况。

下面是我的python版解答,写的比较暴力,但也得了满分:

# 第一题
def solution(A, B, C, D):
    case1=(A-B)**2+(C-D)**2
    case2=(A-C)**2+(B-D)**2
    case3=(A-D)**2+(B-C)**2
    maximum=max(case1,case2,case3)
    return maximum
# 第二题
def solution(S: str):
    tokens = S.split(' ')
    stack = []
    lenth = 0
    for token in tokens:
        if token.isdigit():
            if int(token) - float(token) != 0:
                return -1
            stack.append(int(token))
            lenth += 1
        elif token == 'POP':
            if lenth > 0:
                stack.pop()
                lenth -= 1
            else:
                return -1
        elif token == 'DUP':
            if lenth > 0:
                stack.append(stack[lenth - 1])
                lenth += 1
            else:
                return -1
        elif token == '+':
            if lenth > 1:
                num1 = stack.pop()
                num2 = stack.pop()
                res = num1 + num2
                if isBadNum(res):
                    return -1
                stack.append(res)
                lenth -= 1
            else:
                return -1
        elif token == '-':
            if lenth > 1:
                num1 = stack.pop()
                num2 = stack.pop()
                res = num1 - num2
                if isBadNum(res):
                    return -1
                stack.append(res)
                lenth -= 1
            else:
                return -1
        else:
            return -1
    if lenth > 0:
        return stack.pop()
    else:
        return -1


def isBadNum(num):
    if num < 0 or num > 2 ** 20 - 1:
        return True
# 第三题
class Point2D:
    x = 0
    y = 0
    # library with types used in the task


def solution(A):
    total=len(A)
    table=[[0]*total for _ in range(total)]

    for i in range(total-1):
        for j in range(i+1,total):
            table[i][j]=getSlope(A[i],A[j])

    res=0

    for i in range(total-2):
        slops=table[i][i+1:]
        slops_set=set(slops)
        for slop in slops_set:
            num=slops.count(slop)
            if num>=2:
                res+=int(num*(num-1)/(2))

    if res>100000000:
        res=-1

    return res

一面

由于今年情况特殊,面试都是线上进行。

一面前面根据项目经历简单问了问,问到了Java中乐观锁和悲观锁(幸好前一天看到了)。然后就是两道算法题:

第一题:非递归方法,后序遍历二叉树。数据结构的课上学过,很快就写出来了。

第二题:从单链表中删除倒数第n个节点。最好的办法是用两个指针,中间具体为n,同时向后移动,后一个指针到链表尾部的时候前面的指针正好指向倒数第n+1个节点,就可以进行删除操作了。

两道题总体都比较简单,就顺利通过了。

三面

微软面试有个特点,如果一面面过了就直接三面,没过才需要二面,相当于多给一次机会。

三面感觉已经基本上不怎么问技术问题了,前面就问了一些工作生活的基本态度,比如不是由于自己的原因,但是自己负责的项目交付迟到了被领导批评要怎么做这样的问题。很像其他公司面试的HR面了。

最后让做了一道算法题:写一个函数,将十进制整数右移n位,把从各位溢出的位数补到开头。这个当时感觉做的不太好,因为很多情况没有考虑完全,比如n是负数之类的,被面试官指出来了。

后续

过了几天受到邮件,Thank you for applying… 我心想这凉了,结果点进去竟然是收集个人信息的问卷。

3月31日终于收到了Offer,开心!yes