华为提前批面经

笔试:

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
#include
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面,没什么面经,不要太钢就行。

手撕代码一定要冷静,撕出来了就是直接下一面,撕不出来就是泡池子一周,缺人再来捞你。

你可能感兴趣的:(C++学习,面试)