2022微软上海C+AI SWE暑期实习面经(已OC)

2022.2.21 微软上海C+AI 暑期实习正式批SWE

0.代码模板

先放一个我写算法题的cpp模板,面试的过程中我都是用这个模板来写的,里面还细分了各种题型专用的模板。

repo:https://github.com/Jiahui-Gu/CPPTemplate

一面(2022年2月21日上午11点)

1.聊天部分

面试官因为上一场面试迟到了20多分钟,这种其实是好事,因为面试官多少会带点歉意。

开头先自我介绍,我说到我之前在xx公司实习过,面试官追问我在那边实习感觉开心吗。

他说他面了很多人都在这个公司实习过,问我这个公司在什么位置。

问我本科是什么学校的,延伸出来是哪里人等等一系列问题。

聊的挺开心的,都快忘了是技术面试了。。。

最后问我刷LeetCode吗(可能因为我专业不是计算机),我说天天刷,昨天还打了周赛。

2. 算法题

我要发一个正整数,但是我键盘的一个数字键(2-9的其中一个数字)坏了,需要把这个正整数拆成两个正整数来发送,保证两数之和为先前的数字,同时拆分的两数都不包含坏数字,比如输入233,3坏了,应当返回222和11。

/*************************************************
Author: GuJiahui
Date: 2022-01-10
Description: CPPTemplate
*************************************************/

#include "base.h"
int main(){
    string s = "233";//输入数字
    char c = '3';//坏数字
    string add = "";//额外数字
    for(int i = 0; i < s.size(); i++){
        if(s[i] != c){
            if(add.size() != 0) add.push_back('0');
            continue;
        }
        s[i]--;
        add.push_back('1');
    }
    cout<<s<<endl;
    cout<<add<<endl;
    return 0;
}

3.反问

问了下部门的常用语言,面试官说基本用c#,不过面试对语言没要求。

其实才面了30分钟,但是因为面试官的迟到,已经要12点了,所以就没问了,大家都去吃饭吧。

二面(2022年2月22日上午11点)

1. 聊项目

开头先自我介绍,我说到我之前在xx公司实习过,之前实习参与了两个系统,问了我这两个系统的关联。

问了之前实习很多非技术的细节,估计是考察是否真的参与了项目(10分钟,还挺深入的)。

问我mq是如何工作的,之前公司mq的权限管理是咋样的(因为我简历里写了mq)。

2. 算法题

有效的数独https://leetcode-cn.com/problems/valid-sudoku/ 的改版,比原题要难一点点。

题目:给你一个长宽都为size的二维矩阵,矩阵的元素取值区间为[0,size],其中0表示这里没有数,其他数字表示这里的数值,问这个二维矩阵是否满足数独的条件。

/*************************************************
Author: GuJiahui
Date: 2022-01-10
Description: CPPTemplate
*************************************************/

#include "base.h"
bool isValid(unordered_map<int, bool>& m, int num){
    if(num == 0) return true;
    if(m.find(num) != m.end()) return false;
    m[num] = true;
    return true;
}

int main(){
    int size = 9;//数独边长
    int smallLen = sqrt(size);//小方格边长
    if(smallLen * smallLen != size) return 0;

    vector<vector<int>> v = {};//输入的数独二维矩阵

    //每行是否符合规则
    for(int i = 0; i < v.size(); i++){
        unordered_map<int, bool> m;
        for(int j = 0; j < v[i].size(); j++){
            if(!isValid(m, v[i][j])) return 0;
        }
    }

    //每列是否符合规则
    for(int j = 0; j < v[0].size(); j++){
        unordered_map<int, bool> m;
        for(int i = 0; i < v.size(); i++){
            if(!isValid(m, v[i][j])) return 0;
        }
    }

    //每小格是否符合规则
    int raw = 0, col = 0;//小格的左上角点的坐标
    for(int i = 0; i < size; i++){
        unordered_map<int, bool> m;
        for(int dr = 0; dr < smallLen; dr++){
            for(int dc = 0; dc < smallLen; dc++){
                if(!isValid(m, v[raw+dr][col+dc])) return 0;
            }
        }
        col += smallLen;
        if(col >= size){
            col = 0;
            raw += smallLen;
        }
    }

    return 1;
}

问假设数独size=n的时空复杂度,答:时间最坏最好平均都是o(),空间最好o(1)最坏o()
ps:现在想想时间复杂度不太对,时间应该是最好o(1),最坏o(),不过当时面试官是肯定了我的答案的,估计他也没想到。

代码没跑,因为输入太难弄了,面试官肉眼debug

3.反问

Q: 我要面二面是一面没过吗?

A: 一面过没过都要二面,但只要过一个就能终面

Q:暑期实习hc有多少?
A:不知道

2022年2月23日上午12点收到终面邮件

三面(2022年2月25日上午10点)

面试官迟到10分钟,5分钟的时候打电话来说等他一会,为此还埋下了伏笔。。

1.项目(30分钟)

负责了哪些部分。

最困难的事。

以及一些细节。

项目问的时间太长了。。。

2.算法

算法题1

题目:给你nums数组,在其所有可能的全排列中,等概率返回一个。

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]中的一个

一开始没写出最优解(往蓄水池抽样想去了),面试官说问可以原地吗?才写出了最优解

题解:

/*************************************************
Author: GuJiahui
Date: 2022-01-10
Description: CPPTemplate
*************************************************/

#include "base.h"

int main(){
    vector<int> num = {1,2,3,4};
    int lo = 0;
    while(lo < num.size()){//4
        int randIndex = rand(lo, nums.size())// rand函数返回[lo,nums.size())间的一个非负整数
        swap(nums[lo++], nums[randIndex]);
    }
    return 0;
}

Q:时空复杂度?

A:时间o(n),空间o(1)

Q:如果这个函数是一个黑盒,你要如何证明它是等概率返回的?

A:测试一万次,看分布

算法题2

题目:找出数组中最大的K个数

因为项目讲的太多,时间不够了,面试官让我讲想法,参考这个:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/

Q:如果K很大怎么办:

A:改为找最小的nums.size()-k个数,存到map中,然后循环原数组,在map里就不要,不在map里就要
ps:事后想想不用存map,应该把最小的nums.size()-k个数存在一个大顶堆中,最后只要堆顶元素就好,然后循环原数组,大于这个堆顶元素就要

Q:时空复杂度:

A:时间o(nlog(k)),空间o(k)

3.反问

中间有个插曲是做算法题2的时候,我可以听到面试官声音,但是他听不到我,所以我就给他打电话过去了,至于为什么知道电话,参看本次面试开头。

说完算法题之后,因为下一场面试要开始了,所以就没有反问环节,光速结束了,感觉三面是面的最差的一面。

2022年3月8日上午8点,官网状态Completed

2022年3月9日下午4点,收到offer letter

#实习经验分享##实习##面试流程##面试题目##微软#
全部评论
请问楼主是第一批投递的吗?
1 回复 分享
发布于 2022-02-21 15:04
大佬加油
1 回复 分享
发布于 2022-02-21 15:24
🎉恭喜牛友成功参与 【实习经验分享】活动! ------------------- 分享你的实习面经,进行复盘和总结,助力春招!参与即有奖~ 👉快来参加:https://www.nowcoder.com/discuss/832274
1 回复 分享
发布于 2022-03-01 10:55
大佬是什么时候oc的呀😭俺3.4的终面,3.9的dc,不知道什么时候能有消息
1 回复 分享
发布于 2022-03-14 21:05
大佬,可以请教一下算法题的思路嘛
点赞 回复 分享
发布于 2022-02-21 15:32
更新了二面面经
点赞 回复 分享
发布于 2022-02-22 14:27
更新了三面面经
点赞 回复 分享
发布于 2022-02-25 11:27
三面算法题二中找出数组中最大的K个数 题主当时是不是用小根堆做的啊 面试官问如果K很大怎么办 题主的回答很巧妙 要是我的话 我会用快排思路找最大的K个数 那样时间复杂度就是O(n)了
点赞 回复 分享
发布于 2022-02-25 22:18
同面完 C+Ai 苦等 offer 中,不知道能不能过 😥
点赞 回复 分享
发布于 2022-02-28 19:51
你好,听说这个部门是英文问问题,楼主是中文还是英文,还是可以选择语言
点赞 回复 分享
发布于 2022-03-13 17:21

相关推荐

02-08 15:53
门头沟学院 Java
CoderEcho:让公司知道便宜没好货
点赞 评论 收藏
分享
评论
10
50
分享

创作者周榜

更多
牛客网
牛客企业服务