华为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; }
标准答案在这个上面做了优化,不用一个砖缝一个砖缝的看了,因为偷窥很不好。