分为机考和面试两个部分,机考240/600,面试三轮,前两轮技术,最后一轮简历,积累了一点自信,但也看到了差距,之后要好好刷题,争取更加从容,加油!
一、机考
上周12.8参加了华为秋招的机试,不是在牛客网,是自己的平台,手机没有被绑定。三道编程题,都非常的不友好,最终只做出来了第二题,拿到了200分。
- 经验总结:
- 有时第一题看起来简单,但是很复杂,分值又低,如果非常难搞,建议先完成后面的题目
- 题目给出的测试样例很少,有一些特殊的场景需要自己去想到,比如第二题计算并行任务数时,在第一个时间戳之前是可以有任务存在的,这里是个大坑
- 第一题和第三题没做出来,之后有机会先把第三题做了,再做第一题
二、面试
本周一12.13日(南京大屠杀纪念日)完成了三轮面试,积累了一定的自信,但还要继续努力,毕竟面试官比较熟悉,题目也比较熟悉,之后的面试必然不会这么简单。
第一轮面试:王云鹤
面试流程:
- Part1:自我介绍+工作讲解+提问细节+概率题(共30min)
- Part2:编程(解数独,自己写输入输出)
经验总结:
- Part1中没有过多刁难,但是有些项目细节还需要进一步熟悉和搞懂
- 由于之前做过解数独这道题,所以做起来思路上是清晰的,但是最后还是代码有细节上的bug,std库用的也不是很好,导致最后没有了debug的时间
概率题:宝剑升级
编程题:解数独
- 方法:dfs搜索每一个空白位置,每一个位置依次尝试1-9这九个数字,符合要求则继续深搜,不符合则回溯,注意回溯时需要将相应的flag修改回来
- 技巧:
- 为每行每列每个block都建立一个bool型的数组,用于存放当前行、列、block内,当前数字是否已被用过
- 存储空白点的位置,存入vector中,然后直接这些位置,而不用类似于迷宫再去上下左右的走
- 编程实现:
vector<pair<int, int>>
的使用,用于存储空白点位置pair<int, int>
:可以存储“变量当前值”,和vector配合使用时,要用emplace_back()
,提取时用.first
和.second
- Debug:
block[x/3][y/3][num]
这里忘记除以3了char(i + '1')
才可以把i变为相应的字符型,如果是char(i)+1
则和前者的效果不一样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using namespace std;
/*
board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]
*/
char board[9][9];
bool row[9][9];
bool colum[9][9];
bool block[3][3][9];
vector<pair<int, int>> pos;
bool result = false;
void dfs(int cur)
{
if(cur == pos.size())
{
result = true;
return;
}
int x = pos[cur].first;
int y = pos[cur].second;
// cout << x << y;
for(int i=0; i<9; ++i)
{
if(!result && !row[x][i] && !colum[y][i] && !block[x/3][y/3][i])
{
row[x][i] = colum[y][i] = block[x/3][y/3][i] = true;
board[x][y] = char(i + '1'); // char(i) + '1' is not right!!
dfs(cur+1);
row[x][i] = colum[y][i] = block[x/3][y/3][i] = false;
}
}
}
int main()
{
memset(row, false, sizeof(row));
memset(colum, false, sizeof(colum));
memset(block, false, sizeof(block));
char c;
for(int i=0; i<9; ++i)
{
cin.get();
cin.get();
for(int j=0; j<9; ++j)
{
cin.get();
cin >> c;
board[i][j] = c;
if(c == '.')
{
pos.emplace_back(i, j);
}
else
{
int num = int(c - '0') - 1;
row[i][num] = true;
colum[j][num] = true;
block[i/3][j/3][num] = true;
}
cin.get();
cin.get();
}
}
dfs(0);
for(int i =0; i<9; ++i)
{
for(int j=0; j<9; ++j)
{
cout << board[i][j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}
第二轮面试:陈醒濠
面试流程:同上
经验总结:意识到了一些自己之前工作中可以继续深挖的点,非常感谢醒濠,之后一定会做出尝试的
编程题:9键字符序列对应的全排列
- 方法:对于字符串中的的每一个数字,递归遍历他对应的字符,加入到当前排列中,回溯时,删除当前字符
- 技巧:
- 将数字与字符的对应关系提前存好,下标关系对应即可,有时用空间换思路上的简单明了也是可以的
- 编程实现:
- 用
vector<string>
存取全部的排列结果 - 用
string
存取当前排列结果push_back()
:可以在string后加入charpop_back()
:删除string后面的一个char
- Debug:
- 加入特殊字符的判定,全局加入
bool flag = false;
- 加入特殊字符的判定,全局加入
- 用
1 |
|
第三轮面试:蒋欣(NLP大佬)
- 面试流程:只有半小时的简历面
- 问题:
- 简短介绍之前工作
- 之前项目最大的挑战
- 公司价值观是否认同以及匹配
- 长期规划
- 反问:科研和项目的部门是否分开?