华为Cloud BU实习一面凉经

算是正儿八经的第一次求职面试。我在这里复个盘,大家吸取一下教训。
//-------------------------------------------------------------------------------------------------------------------------------
先把复盘总结写在前面,后面的可看可不看。
1 -- 简历是敲门砖,尽量突出自己,但是要真实,内容在精不在多。论文 专利 很重要。
简历上的写的项目,要多准备细节;这也算是诱导提问了。
2 -- 不要先入为主,觉得我应聘的是某某岗位,其他的内容不会涉及。大家尽量在自己
的能力范围提升知识面,同样,在精不在多。
3 -- 基础要扎实,忘记的东西不要紧张,放松一下,相信自己,我就是有些过于紧张,发挥不理想。
一辆车如果底盘破的太厉害,还有有人要吗?--- 有,收废品的。
4 -- 手撕代码,能精简就精简,多做多错,切记。
-- 题目要确定自己清楚了,我有些图快,迅速的读完,想了想就开始做了,结果欲速则不达,还遗漏细节。
-- 面试环节手撕代码,尽量写注释,变量不要过长。
-- 如果你很快的想到一个方案,但是觉得不是最好的,可以适当的深入思考。
5 -- 面试的时间尽量错过吃饭时间和下班时间。最好是在早上的9:30点左右,即使面了两个小时,也不到12点

6 -- 补充一点,机试和面试时间尽量不要间隔太久,虽然不可控,但是事先要有准备,像我这样机试和面试隔了20天,面试官一点没提机试的东西。【前提是你觉得机试还不错,禁得住问】
//-------------------------------------------------------------------------------------------------------------------------------------
正文:
平时主要用C++,C++ 内存模型,原子序,多线程,泛型编程,模板元编程,虚函数指针机制都琢磨过;
编程能力自己觉得中等,和大神没法比,但是基本数据机构--红黑树;算法--动态规划,分治,DFS
掌握的都还可以,4月8号参加的机试,前两个AC,最后一个90%,是解数独问题。
【自我感觉良好,哈哈】
---------------------------------------------------------------------------------------------------------------------
直接说面试:
因为自己投的是软件开发岗位,所以以为只会问一些计算机底层 、
操作系统 + C++的问题 ----- 【先入为主,错误低估敌情,兵家大忌】
//------------------------------------------------------------------------------------------------------------------
刚开始还好,问了有没有专利【暂时没有,下次就有了】,
有没有论文【估计不会】
有没有获奖【平平无奇的校内奖】,
有没有参加比赛【没有】 ----- 这块没得分数了。
//-------------------------------------------------------------------------------------------------------------------
接下来问了一下研究方向,然后就着这个方向问了一些统计学习的问题---回答的一般。
然后问了为什么选择深度学习做,基于什么考虑。【就是想试一试行不行啊】
//-------------------------------------------------------------------------------------------------------------------
大型翻车现场来了:
问了我指针、引用和指针指针的区别 ------ 没停顿,一口气说完,把smart的引用计数忘记说了。他也没提
然后让我写二维数组动态分配。
。。。居然忘了。。。 我写的是 int **p = new (int*) [N];  delete[]  p.注意这个括号,是它害得我被喷。
说实话,自从用了标准库,从来没用过new和delete了。但是当时确实有些紧张,只想到了变通的方法,
没试就下一题了,给大家看一下:
<template T>
T* make_ptr(size_T N) { return new T[N]; }

int **p = make_ptr<int*>(N);
一维数组都能写出来,int* p1d = new int[N]; delete[] 二维的我偏偏要加括号【神仙难救】
这个题目完事之后就一直喷我:在学校是不是只用matlab啊? 喷了好几遍。
//--------------------------------------------------------------------------------------------------------------------------------
好了下一题:也是最后一题
砖墙问题,第一次做,说句实话,确实不难,但是第一时间想到的不是最优方案,但可行。思维这个东西,
先出来的方案自然而然会按照这个思路走,除非走不通才会换其他的思路。
后面就按照这个可行方案写了。简单描述一下:就是把每一行的砖当做单位长度,然后一个一个缝隙去看
这个方案虽然可行,但是当每一行的砖太多会超时。
struct pos{
    int currentPos;//记录对应一行当前列
    int pre;//记录对应一行当前列前面所有砖总和
};
int testBlock(vector<vector<int>>& blocks){

    if(blocks.empty()) return 0;
    if(blocks[0].empty()) return 0;

    int N = blocks.size();
    vector<pos> position(N, {0,0});
    
    int width = 0;
    for(auto& w : blocks[0]) width += w;//获取每行总砖数
    int min_val = N;
    
    for(int i = 1; i < width; ++i){//从第一个缝隙看
        int tmp = N;//最坏情况
        for(int k = 0; k < N; ++k){
            int &col = position[k].currentPos;
            int &pre = position[k].pre;

            if(blocks[k][col] + pre == i){//当前列的长度和前面所有砖的长度和 == i:刚好在第i个缝隙上
                
                pre += blocks[k][col];//更新pre
                ++col;//移动到下一列,当前列已经走完了
                --tmp;//每块在缝隙上的砖都从总数去除掉
            }

            if(tmp < min_val){//更新
                min_val = tmp;
            }
        }

    }
    return min_val;
}
但是面试官看不懂我的,一直觉得我的思路有问题。我画图给他看,他也说不懂,纠结了有20几分钟


后来看了优化的方法,我明白了,他心里已经有正确答案了,总是觉得我的方法就是不行。
关键是到了吃饭时间了,他也没心思在继续了,然后就一拍两散了。
//---------------------------------------------------------------------------------------------------------------------------------------
其实我当时写的代码比上面的多了几行,逻辑是一样的 --- 多做多错,所以代码能精简就精简
下面的代码只要改一下【限制在两个字符】,就能通过。
也正是因为这一个字符,因为一遍测试没过,也到1点钟该吃饭了,所以也就没给我调试的机会
没抓住最后的稻草。
//---------------------------------------------------------------------------------------------------------------------------------------
struct pos{
    int currentPos;
    int pre;
    bool isFull;//当前砖块是否完整通过
};
int testBlock(vector<vector<int>>& blocks){

    if(blocks.empty()) return 0;
    if(blocks[0].empty()) return 0;

    int N = blocks.size();
    vector<pos> position(N, {0,0, false});
    
    int width = 0;
    for(auto& w : blocks[0]) width += w;
    int min_val = N;
    
    for(int i = 1; i < width; ++i){

        for(int k = 0; k < N; ++k){
            int &col = position[k].currentPos;
            int &pre = position[k].pre;
            bool &isFull = position[k].isFull;
            if(blocks[k][col] + pre == i){
                
                pre += blocks[k][col];
                ++col;
                isFull = true;
            }
            int tmp = 0;
            for(auto p : position) if(p.isFull) ++tmp;
            if(N - tmp < min_val){
                min_val = N - tmp;
            }
            for(auto p : position) p.isFull = false;
        }

    }
    return min_val;
} 


标准答案在这个上面做了优化,不用一个砖缝一个砖缝的看了,因为偷窥很不好。

#华为2020实习生招聘##华为##实习##软件研发工程师##面经#
全部评论
太惨了
1 回复 分享
发布于 2020-04-29 09:32
过了么?楼主
点赞 回复 分享
发布于 2020-04-29 18:24
怎么知道挂没挂的
点赞 回复 分享
发布于 2020-04-29 19:07
为什么你面试这么难。。 我就写了个输出一个字符串里出现超过两次的子串。 就问了一两个技术问题。。 (可能是因为我简历上只有一个项目其他都是论文。。。 ) 我菜地不敢分享一面经历
点赞 回复 分享
发布于 2020-05-08 08:27

相关推荐

5 16 评论
分享
牛客网
牛客企业服务