0%

21年华为秋招

分为机考和面试两个部分,机考240/600,面试三轮,前两轮技术,最后一轮简历,积累了一点自信,但也看到了差距,之后要好好刷题,争取更加从容,加油!

一、机考

上周12.8参加了华为秋招的机试,不是在牛客网,是自己的平台,手机没有被绑定。三道编程题,都非常的不友好,最终只做出来了第二题,拿到了200分。

  • 经验总结:
    1. 有时第一题看起来简单,但是很复杂,分值又低,如果非常难搞,建议先完成后面的题目
    2. 题目给出的测试样例很少,有一些特殊的场景需要自己去想到,比如第二题计算并行任务数时,在第一个时间戳之前是可以有任务存在的,这里是个大坑
    3. 第一题和第三题没做出来,之后有机会先把第三题做了,再做第一题

二、面试

本周一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
    #include<bits/stdc++.h>
    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后加入char
      • pop_back():删除string后面的一个char
    • Debug:
      • 加入特殊字符的判定,全局加入bool flag = false;
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
#include<bits/stdc++.h>
using namespace std;

char Map[8][4] = {{'a', 'b', 'c', '#'}, {'d', 'e', 'f', '#'}, {'g', 'h', 'i', '#'},
{'j', 'k', 'l', '#'}, {'m', 'n', 'o', '#'}, {'p', 'q', 'r', 's'},
{'t', 'u', 'v', '#'}, {'w', 'x', 'y', 'z'}};
string s;
string rst;
vector<string> result;
bool flag = false;

void permute(string & rst, int cur)
{
if(cur == s.size())
{
result.push_back(rst);
return;
}
int num = int(s[cur] - '0') - 2;
if(num<0 || num>7)
{
flag = true;
return;
}
for(int i=0; i<4; i++)
{

if(Map[num][i] != '#')
{
rst.push_back(Map[num][i]);
permute(rst, cur+1);
rst.pop_back();
}
}
}

int main()
{
cin >> s;
permute(rst, 0);
if(flag)
{
cout << "[]" << endl;
}
else
{
for(int i=0; i<result.size(); ++i)
{
cout << result[i] << endl;
}
}

system("pause");
return 0;
}

第三轮面试:蒋欣(NLP大佬)

  • 面试流程:只有半小时的简历面
  • 问题:
    • 简短介绍之前工作
    • 之前项目最大的挑战
    • 公司价值观是否认同以及匹配
    • 长期规划
    • 反问:科研和项目的部门是否分开?
欲戴皇冠,必承其重,加油!