美文网首页HR面试0.面试技能
记一下阿里的四面和hr面

记一下阿里的四面和hr面

作者: BBBBBigOrange | 来源:发表于2019-05-22 15:43 被阅读22次

    阿里四面是大约5月9日的事情,hr面是大约5月14日的事情。不得不说阿里是真的拖,除了一二面效率挺高的,后面都很拖。。hr面后过了一周到现在还没有结果,幸好自己被字节跳动捞起来了。。目测要去字节跳动实习了。面阿里从紧张到麻木,最坑的是官网上一直都写面试中,也不写一下具体的进度,也不写一下之前面试的评分情况。不过还是在这里记一下阿里四面和hr面的过程。之前因为事情比较多,所以一直都没写,现在趁有空赶紧写下吧,不过时间久了有些内容有点忘了。

    四面是技术交叉面,面试官说要让我写代码。写代码有两题:
    1、手写单例模式
    这个其实挺基础的,就是最好把懒汉模式和恶汉模式都写出来,然后要考虑一下多线程下的互斥。
    2、约瑟环问题。有标号为1-n的n个人, 轮流报数1,2,3,4,5,.......,报m的退出,求最后剩的人的代号。
    这个问题其实有三种解法,一种是用数组,一种是用链表(这两个都可以说是仿真的方法),第三种是数学解,写在下面。我在面试的时候写了一下数组和链表的,不过一直没处理好边界情况,加上有一点慌(其实面试结束后就运行成功了。。)

    写完代码以后面试官又问了我一个技术问题:大数据存储并排序问题。
    8核16G。有3T大数据,里面都是长整型,然后要排序。我想的答案都写在下面吧:

    一、1-n,报m的退出,求最后的数。

    数学解方法:

    为了方便用一个大小为n的数组来存这n个数,(也方便取余数),先把1~n转换为0~n-1。

    1、第一个退出的是(m-1)%n,此时剩下n-1个人(假设这时候剩的人大于1个)。从m%n开始报数,可以把m%n的下标看做0,也就是:

    a+1 → 0

    a+2 → 1

    a+3 → 2

    ……

    ……

    ……

    a-1 → n-2 (假设m%n是a)

    假设最后胜利者的在映射后的下标是x。那么它在原始下标中(也就是在0-n-1中的下标),编号为

    (a+x)%n=(m%n+x)%n=(x+m)%n。

    2、接下来第二轮,被删除的数是映射后坐标的第(m-1)%(n-1)个人。还是相同的步骤。有

    b+1 → 1

    b+2 → 2

    b+3 → 3

    ……

    ……

    ……

    b-1 → n-3 (假设m%n是b)

    假设最后胜利者的在第二次映射后的下标是y。那么它在第一次映射后的数组中,编号为

    (b+y)%n=(m%(n-1)+y)%(n-1)=(y+m)%(n-1)。

    重复上述过程,直到只剩一个人。很明显只剩一个人的时候最后的映射坐标中这个人坐标肯定是0。用公式倒推回去:

    f(1)=0;

    f(2)= (f(1)+m)%2;

    f(3)= (f(2)+m)%3;

    ……

    f(n)=(f(n-1)+m)%n;

    同时要记得最后f(n)再加1。

    因此要求n和m的情况,按照上述过程计算下去就可以得到最终答案。

    二、大数据存储并排序问题。

    8核16G。有3T大数据,里面都是长整型,然后要排序。

    1、将数据细分成一个个1.8G的块来读取(因为2G*8=16G,这里为了留一些内存)。

    2、一次读取8个块,分配到8个内核上,然后可以进行一些压缩,因为3T数据里都是长整型的话肯定有很多重复的数据,可以采用一些压缩的方法,比如说用map统计数据出现频率,或者是字典树这种。然后使用快速排序算法。这样的话假设读入的数据是[0,2,4,1,3,5,0,0,2,2,1,1,3,3,2],用map统计后的结果就会变成{0:3, 1:3, 2:4, 3:3, 4:1, 5:1},这里冒号前是数据,冒号后是出现的次数。同时用一个long unsigned int类型的size来保存这个map中数据总量大小。如果数据量大并且重复次数多压缩效果会更好。

    3、然后把map文件存回硬盘中,读取接下来的8个块。直到所有的块都被读取并排序。

    4、每次读取若干个map文件,进行归并(根据空闲的CPU数还有内存情况)。假设map1大小是size1,map2大小是size2,可以在读取第二个文件的时候预留size1+size2的空间,然后两个文件从文件尾向文件头进行归并排序,存到map2的空间中(从后往前存),这样可以节省size2大小的内存空间归并完后释放map1的内存空间,以及map2最前头没有被归并过程用到的内存空间。

    5、后面每次都留几个处理器来进行进一步的归并。比如第一次读取了16个map文件(map1map16),归并成8个,那么留4个CPU将这8个归并成4个,另外4个CPU去读下一批文件(map17map24,前提是不超出内存大小,所以可能会有处理器处于空闲状态)。如果归并次数最多的map文件(比如map1~map16已经被归并到只有4个map文件了)超过一定大小,写出到磁盘中,但是因为数据是随机分布的,所以其实每个map中键的内容都差不多,大多数归并情况可能只是修改值的大小,所以归并后的map文件相比最初的map文件大小增长可能不大,因此可以减少IO次数。

    6、最后,如果最终map文件的大小超出了内存大小,还是分块来读取最终map文件,从键值来复原原始数据,逐块写出到最终排序后的文件中(可以覆盖原始的3T大数据,如果不需要最原始的数据的话)。这里如果要利用多处理器的话,比如读8个block,先统计每个block中出现频率之和count,开辟count大小的空间然后还原数据,再写出到磁盘中(要保证写出的时候也是按顺序的,比如还原map2的时候写出时要从地址为count1的位置开始写),如果内存不够的话可能有些处理器中的进程要被阻塞。这里主要是考虑到CPU处理时间和IO时间的关系,如果CPU处理很快,IO很慢,为了尽量减少IO次数,有几个CPU不在运行损失相比起来也会小一点。

    这里主要是面试官一直问我如何降低IO操作的频率,最好就是归并的时候只用一次IO?(忘记具体要我用几次了)。最后只想了上面那个方法,还是需要很多次IO操作。。希望有大神能告诉我这道题怎么回答。。

    然后是约瑟环问题的代码,下面把头文件和源文件都贴出来了:
    (后来面试官让我微信再给他发答案,因为我在规定时间没写完,他说再给我一次机会。。第一次交的时候还跟我说最好要写成面向对象的形式,将逻辑解耦开来)

    //
    // Created by orange on 19-5-9.
    //
    
    #ifndef EIGENPRACTICE_UTILS_H
    #define EIGENPRACTICE_UTILS_H
    
    #include <list>
    #include <vector>
    using namespace std;
    
    class BaoshuUsingList{
    public:
        BaoshuUsingList(int n,int m);
        int getFinalNumber();
    private:
        int n;
        int m;
        list<int> arr;
    };
    
    class BaoshuUsingVector{
    public:
        BaoshuUsingVector(int n,int m);
        int getFinalNumber();
    private:
        int n;
        int m;
        vector<int> arr;
    };
    
    class BaoshuUsingMathMethod{
    public:
        BaoshuUsingMathMethod(int n,int m):n(n),m(m){}
        int getFinalNumber();
    private:
        int n;
        int m;
    };
    
    #endif //EIGENPRACTICE_UTILS_H
    
    //
    // Created by orange on 19-5-9.
    //
    
    #include "utils.h"
    using namespace std;
    
    BaoshuUsingList::BaoshuUsingList(int n,int m):n(n),m(m){
        for(int i=0;i<n;++i)
            arr.push_back(i+1);
    }
    
    int BaoshuUsingList::getFinalNumber() {
        /*
         * 如果想要重复使用实例,可以在这里复制一个新的list,保持成员函数中的list不变
         */
        int escape=0; //已经退出的人数
        int number=0; //报的数字
    
        int i=0;
        for(list<int>::iterator it=arr.begin();it!=arr.end();++it,++i)
            *it=i+1;
    
        list<int>::iterator it=arr.begin();
        while(escape<n-1){
            number++;
            if(number==3){
                it=arr.erase(it);
                escape++;
                number=0;
            }
            else
                it++;
    
            if(it==arr.end())
                it=arr.begin();
        }
    
        return *arr.begin();
    }
    
    BaoshuUsingVector::BaoshuUsingVector(int n, int m):n(n),m(m),arr(vector<int>(n,0)) {
        for(int i=0;i<n;++i)
            arr[i]=i+1;
    }
    
    int BaoshuUsingVector::getFinalNumber() {
        int escape=0; //已经退出的人数
        int number=0; //报的数字
        int i;
        for(i=0;;++i){
            i%=n;
            if(arr[i]>0)
                number++;
            if(number==3){
                escape++;
                if(escape==n){
                    break;
                }
                number=0;
                arr[i]=0;
            }
    
        }
        return arr[i];
    }
    
    int BaoshuUsingMathMethod::getFinalNumber() {
        vector<int> result(n,0);
        for(int i=1;i<n;++i)
            result[i]=(result[i-1]+m)%(i+1);
        return result.back()+1;
    }
    

    后来面试官跟我说评分给了我A-,只要是A就有机会HR面。所以后来又来了一轮HR面。下面记一下HR面的过程:

    一开始还是让我自我介绍。然后进入问答环节:

    问:为什么要转行。
    答:一是因为自己学了一些计算机的知识,跨学院上了一些计算机学院的课,然后做过一些相关的实习,发现自己还是对编程的工作更感兴趣。
    二是汽车行业现在非常不景气,和以前没法比。工作的一个重要目的就是为了赚钱,互联网行业薪资较高。
    (其实当时忘了说一点,本来自己想说觉得传统机械行业对动手能力要求比动脑能力要求高得多。。感觉对自己挑战不够)

    问:为什么选这个岗位。
    答:因为这个岗位是做C++研发,机器学习工程方向。自己以前主要就是用C++的,然后这个岗位要求的算法、操作系统这些自己也有学过,对机器学习也有一些了解,觉得自己和这个岗位的要求很相符。

    问:职业规划是什么,想做算法还是开发
    答:一个公司算法和开发都很重要,算法更加核心,开发岗位更多。其实人都想做更核心的工作,但是要跟自己的能力相匹配,我觉得自己的知识、实习经历都和开发更加相关,所以想做开发。但是也想在开发的过程中多学习一些算法的知识,争取以后有机会往算法方向转,所以选了这个C++研发下面的机器学习方向。

    问:大约从什么时候开始准备转行的。
    答:大概从本科最后一年的时候开始。

    问:相比计算机科班的觉得自己有什么优势?
    答:
    1、两个专业经过比较以后,更加明白自己的兴趣究竟在哪,所以在入职以后会更有热情。
    2、比较虚心,因为不是科班出身,所以会一直保持一颗学习的心态去参与工作,对于同事的批评会虚心去接受,有不懂的也会向别人请教。
    3、自律。说了一下不是跟科班比,是跟周围的同学比,觉得自己比较自律(有点不要脸,实在没东西说了。。)。说因为别人科班好几年时间学习的内容自己要在短时间内去学完,所以一直都很push自己,给自己制定了计划并且很严格去执行,觉得自己挺自律的。

    问:觉得自己的技术上的优势。
    答:C++用的比较好,然后基础知识掌握的比较牢固,像是操作系统、计算机网络这些。

    然后问了一下我做了什么项目,给她介绍一下,自己评价一下最后的结果相比自己的预期完成度多少。
    答:介绍了一下自动驾驶的项目,然后说预期完成度80%~90%这样,还有一些小瑕疵,具体介绍了一下哪些场景下面识别效果不太好。比如车道线被车辆阻挡,或者有灰尘这样。

    问:有什么改进的方法?
    答:这个就说了一下因为时间之类的问题所以一开始做的时候考虑的东西比较少。数据存储那个是可以把逻辑进一步解耦,然后瞎扯了一些。车道线检测如果时间充足的话可以用一下深度学习的方法,做一下语义分割来划分一下感兴趣区域神马的,这样识别精度更高。

    (然后好像还问了一些问题,时间久了有点忘了。。比如像是问我可以实习的时间这些)

    然后让我问了一些问题:
    我:实习多久才有留用机会。
    HR:这个没有要求,但是基本要跟完一个项目,所以推荐做3个月,但是时间不够的话两个月也行,最后要参加转正答辩。
    我:这个部门具体做什么的。
    HR:这个部门是aliexpress,做的是国际购物业务,像是俄罗斯啊、xxx、xxx之类的国家。
    我:后面还有几轮面试,什么时候会联系我。
    HR:要去和leader汇报一下,可能还有一轮leader面(说好的要么面要么过啊。。怎么就不理我了。。)

    相关文章

      网友评论

        本文标题:记一下阿里的四面和hr面

        本文链接:https://www.haomeiwen.com/subject/moquzqtx.html