笔试:
AC>=1就可以
一面:
主要问和项目相关的知识,手撕代码easy难度,数组去重和排序。
二面:
还是先问一些项目的知识,然后问我对抗学习,强化学习,深度学习,我当时懵了,因为我一开始投的算法后来改投C++开发的,主要就是问它们的实现原理和相互之间的区别,问我机器学习这一块厉不厉害这些,我只能说我学过,emmmmm。不过还好都懂些,都能回答出来一些。然后问我Tensorflow一些细节,并不能全答出来。之后再问我C++,问lambda和STL,这些也算基础知识,都能回答出来,讲道理面试最开心的就是C++的互问互答环节了。
手撕代码真的有点恶心,不是BFS也不是动态规划,更不是贪心,是个螺旋数组,当时我差点写不下去了,赶紧猛喝一口水,接个深呼吸。
题目给三个参数,m,x,y m是螺旋数组的宽度,(x,y)是螺旋数组内给定点的坐标,用1-9九个数字循环填充,求该点的值
举例:
1 2 3 4 5
7 8 9 1 6
6 6 7 2 7
5 5 4 3 8
4 3 2 1 9
x=3,y=1,res=5
刚开始以为可以动态规划,结果浪费了10分钟,其实应该这样解的,上代码:
// 1->9
//1 2 3 4
//3 4 5 5
//2 7 6 6
//1 9 8 7
//m是螺旋矩阵的宽度,求(x,y)坐标处的值 1-9填充
#include<iostream>
#include<vector>
using namespace std;
class solution
{
public:
int getMin(int x,int y)
{
x = x < 0 ? -x : x;
y = y < 0 ? -y : y;
x = x > y ? x : y;
return x;
}
int getPoint(int m, int x, int y)
{
int r = m - 1;//定义外圈半径m-1
int mid = (m-1)>>1;//定位圆心
int circles = mid - getMin(x - mid, y - mid);//圈数目
int res = 0;
for (int i=0;i < circles;i++)
{
res += r * 4;//加圆
r -= 2;
}
//定边 关键要知道圆的四条边
if (circles == x)
res += (y - circles + 1);
else if (m - 1 - circles == y)
res += (r + x - circles + 1);
else if (m - 1 - circles == x)
res += (r * 2 + m - 1 - circles - y + 1);
else
res += (r * 3 + m - 1 - circles - x + 1);
res = res%9==0 ? 9 : res % 9;
return res;
}
};
int main()
{
solution s = solution();
//int res = s.getPoint(5, 2, 3);
int res = s.getPoint(5, 2, 1);
cout << res << endl;
system("pause");
return 0;
}
面试完之后把代码改进了一下,肯定不是最好的方法,但够用了。
三面:
三面我进错房间,导致本来面30分钟,最后面了大概20分钟。主要问一些性格爱好,优缺点,类别HR面,没什么面经,不要太钢就行。
手撕代码一定要冷静,撕出来了就是直接下一面,撕不出来就是泡池子一周,缺人再来捞你。