微软实习生一面+二面+三面面经

OXO部门下的:Forms和Excel API两个组
既有开发也有算法,部门都会做,不特别区分

2面技术面+一面Manager面试
实习期3个月后有转正面试

这是我最轻松的一次面试,面试小哥叫wu tao,人非常Nice,有时候会提醒你思考哪些方面。关键是问的问题我基本都答出来了。明天就会安排二面。

第一面

一:项目

开始面试官先介绍了一下自己,我再自我介绍,然后问项目经验
开始25分钟左右都在问项目,把简历上的项目都问了一下,都会了解你做了一些什么以及遇到问题怎么解决等。

二:算法和设计

然后就是算法题加设计题。

第一题:字符串转float 剑指offer上有

float stringToFloat(string str)
{
}
Valid cases:
1. "100.2"
2. "-100"
3. "0.003"
4. "0.0"
5. "+100"

Invalid cases
1. 不是+-数字小数点
2. 小数点有多个
3. 小数点前后都有数字
4. +- 只能出现一次并且在首位
5. 空串和空格

输出: +- 数字 小数点 数字


def stringToFloat(strr):
    dot = -1
    for i in range(len(strr)):
        if strr[i] == '.':
            dot = i
            break
    front = 0.0
    count = 1
    for i in range(dot-1,-1,-1):
        front += int(strr[i]) * count
        count *= 10
    
    if dot == -1:
        return front
    
    back = 0.0
    count = 0.1
    for i in range(dot+1, len(strr)):
        back += int(strr[i]) * count
        count *= 0.1
    return front + back
   

第二题:链表插入与删除

1->2->3 4  
       ->3.next->4 

第三题:扑克牌排序

Hongtao 1-13
Heitao 1-13
Fangbian 1-13
Meihua 1-13
       
dict[hongtao1] = 1  sort()

1 5 9 2 13 51....
table[1] = 1

hash表:table = [0] * 52

设计题:五子棋盘

用二维表表示,里面的元素可以用int和char来表示,但是char更省空间

第二面:只面了一道算法题

面试官是一个女生: Jiping Shi

上来直接做算法题:1044. Longest Duplicate Substring
输入字符串,找最长连续出现的子字符串
在所有出现多次的子串中(不重叠),找出最长的那个。

abccccddeee
i j
abc
eeeeeee
eee
adeeeee
abcabcefefef

abceeeeeeeeabcabc
abc ef

# 这一个
def longsubString(strr):
    if not strr: return ""
    count = collections.defaultdict(list)
    for i in range(len(strr)):
        count[strr[i]].append(i)
    
    # eeeeeeeee
    res = ""
    maxLen = 0
    for i in range(len(strr)):
        lenij = 0
        for j in range(len(strr)):
            if strr[i] == strr[j]:
                lenij += 1
            else:
                if lenij > maxLen:
                    res = strr[i:(i+j)/2]
                    maxLen = lenij//2
    if lenij > maxLen:
        res = strr[i:j]
        maxLen = lenij 
    
    lenij = 0  
    # abcabc  
    for i in range(len(strr)): # i = 0 
        for j in count[strr[i]]: # j = 3
            if i == j and i > j: continue  # 这个地方可以优化
            windowi, windowj = i, j
            lenij = 0
            while windowi < j and windowi < len(strr) and windowj < len(strr): # 
                if strr[windowi] == strr[windowj]:
                    windowi += 1
                    windowj += 1
                    lenij += 1
                else:
                    if lenij > manLen:
                        res = strr[i:windowi]
                        maxLen = lenij
      if lenij > manLen:
          res = strr[i:windowi]
          maxLen = lenij
      return res

三面:

dixie@microsoft.com
三面:介绍项目,最大的困难是什么?
写完一定得自己测样例,自己想几个测试样例测一测啊!

Question 1: Given an Excel column index, convert to integer. e.g. AA -> 27,反过来也做。
Question 2: Longest ZigZag path in a b-tree
leetcode 1372. Longest ZigZag Path in a Binary Tree

def invert(strr):
  if not strr: return 0
  mapp = collections.defaultdict(int)
  for i in range(len(strr)):
  	mapp[strr[i]] = ord(strr[i]) - ord('A') + 1 
  count = 1
  res = 0
  for i in range(len(strr)-1, -1,-1):
  	res += mapp[strr[i]] * count
    count *= 26
  return res
  
def invert2(num):
  if num <= 0: return ""
  res = ""
  mapp = collections.defaultdict()
  for i in range(26): # 27
  	mapp[i] =  ch(ord('A') + i)
  
  while num > 0:
  	res += mapp[num%26-1]
    num /= 26
  
  return res[::-1]

leetcode 1372. Longest ZigZag Path in a Binary Tree
O(NlogN)的时间复杂度不是最优解啊!完蛋了,面试没做出来!

class Solution(object):
    def longestZigZag(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        self.res = float('-inf')

        def traverse(root, idx):
            if not root: return 0
            if idx % 2 == 0:
                return traverse(root.right, idx+1) + 1
            else:
                return traverse(root.left, idx+1) + 1

        def preOrder(root):
            if not root: return
            depth = max(traverse(root, 0), traverse(root, 1))
            self.res = max(self.res, depth)
            preOrder(root.left)
            preOrder(root.right)
        
        preOrder(root)
        return self.res - 1

最优解:时间复杂度为O(N)啊!

class Solution:
    def longestZigZag(self, root: TreeNode) -> int:
        def zigzag(node: TreeNode) -> tuple:
            if not node: return 0, 0
            _, lr = zigzag(node.left)
            rl, _ = zigzag(node.right)
            self.max_path = max(self.max_path, lr + 1, rl + 1)
            return lr + 1, rl + 1

        self.max_path = 0
        zigzag(root)
        return self.max_path - 1

准备

自我介绍是英文
三面有:聊项目 难点
求数学期望

微软面试算法题总结:

第一题是不能调用库写十进制和十六进制转换。
第二题是判断两个矩阵是否重叠,如果重叠返回重叠面积。
836. Rectangle Overlap 223. Rectangle Area
第三题是一个贪心算法的会议问题,加了一点难度,不是当天调度,可能是一周以内,不过原理差不多,就是跨天的问题处理。

1.树结构的序列化与反序列化
2. 最长公共子序列
多个链表排序和多个数组排序的思路相似
拓扑排序(O(N^2)),需要邻接表,以及记录入度个数

单调栈:三面算法题:一个数组,数组的值代表高度,问可以积下雨水的量。

Leetcode 44. Wildcard Matching(相似题:10. Regular Expression Matching)
最近公共祖先的变种
1375. Bulb Switcher III (我都没印象我做过这道题)
LeetCode 22. Generate Parentheses
[Jobdu] 题目1337:寻找最长合法括号序列
表达式求值(中缀表达式转化为后缀表达式)

Leetcode 155 min stack
如何判断两个链表是不是有交点
Leetcode 79 Word Search
拓扑排序: 课程排序
最长递增子序列
BST转双向链表
最长递增子序列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值