微软Microsoft 暑期实习第一轮笔试
文章目录
概括:题目不难,就结果而言算是良好
但是微软申请必然很卷,如果大多数人都能全部做对的话结果就不好说了;据官方邮件结果发布是在3周以后。
微软一轮面试细节:
- 突然收到邮件通知要求两天内自行完成笔试
- 在codility做题,120分钟三道题
- 完全开卷,无监考可以切屏,可以用本地IDE
- 题目一律核心代码模式
- 不显示所有的数据通过率,只显示4个案例通过情况
正因为是最简单的模式,加上题目本身不难,没全部做出来才感觉结果有点悬
据网上经验贴如果通过会在2~3月份安排面试,在线视频+敲代码
解题记录:(2小时 前2道题案例全过,第3题DP案例没全部过)
题号 | 题目考点 | 解答情况 | 详情 |
---|---|---|---|
1 | 模拟:矩阵操作 | 案例全过 | 按题目要求模拟即可,10分钟解决 |
2 | 模拟:机器人运动 | 案例全过 | 20分钟完成初始代码,再花20分钟本地调试通过,修正了边界条件 |
3 | 动态规划:双生产线求最优解 | 案例2/4通过 | 结果不理想,没构建完善的Bellman方程,时间来不及 |
题目代码:
1、第一题 模拟:矩阵操作
送分题,没用到本地IDE
对N*N全0矩阵,根据输入的字符串和数组操作,最后输出矩阵中最大值
直接模拟法,最后输出最大值时 O ( N 2 ) O(N^2) O(N2)复杂度
如果扣分只能是时间复杂度上优化问题了,但不用直接模拟似乎也没别的解法
2、第二题 模拟:机器人运动
N*M矩阵上有若干障碍物或者没清洁的空地,机器人从[0,0]向右出发,前方遇到障碍物则顺时针回避,输出机器人能清理的空地数量
代码:
#include<bits/stdc++.h>
using namespace std;
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
//机器人顺时针走 状态dir:0,1,2,3表示现在前进方向,遇到障碍后更新dir
//map[N][M]:-1,0,1 标记是否清理过,-1是障碍物
//res 不断更新
//大循环 重复N*M次,最后输出res肯定不会再更新
int solution(vector<string>& R) {
// write your code in C++14 (g++ 6.2.0)
int N = R.size();
int M = R[0].size(), i, j;
vector<vector<int>>map(N, vector<int>(M, 0));
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
if (R[i][j] == 'X')map[i][j] = -1;
/*
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
cout << map[i][j] << " ";
cout << endl;
}*/
// vector<vector<int>>flag=map;
int dir = 0, MAX_TIMES = N * M, res = 0;
i = j = 0;//机器人位置指针
while (MAX_TIMES--)
{
if (map[i][j] == 0)//未清理
map[i][j] = 1, res++;
bool obs_flag = 0;
//判断前方是否有障碍物
do {
if (dir == 0 && (j == M - 1 || map[i][j + 1] == -1))
obs_flag = 1;
else if (dir == 1 && (i == N - 1 || map[i + 1][j] == -1))
obs_flag = 1;
else if (dir == 2 && (j == 0 || map[i][j - 1] == -1))
obs_flag = 1;
else if (dir == 3 && (i == 0 || map[i - 1][j]