2020阿里云实习生面经
9931
2020.10.21
2020.10.21
发布于 未知归属地

d11db4878ef3190a816fde9877f730f3.jpeg

时间安排

  • 2020/4/1 上午,人才测评
  • 2020/4/1 下午,笔试
  • 2020/4/2 下午,一面

人才测评

这个人才测评的考题就比较奇葩了,与技术无关,目前也不知道有啥影响,考试形式为全是选择题,分为几个不同的部分,前三个部分每题会有限时,60s左右一提,最后一部分不限时,整个过程大概50min,实际上30min左右可完成

  • 10题阅读理解,给一段话,选出其中心思想
  • 10题图表信息提取,给一段话加一张表,提取需要的信息,需要使用计算器
  • 10题找规律,可以参考小学做的那种找图形规律的题
  • 98题人格测试,应该是用来测试人的性格吧

笔试

阿里的笔试总共就两道题,每题50分,期间录屏+开摄像头+手机锁,基本杜绝作弊的可能(但录屏只能锁一块屏幕,拓展屏貌似不受影响)

听说无论笔试情况如何都能面试,这个暂时不收很清楚,反正我是一道也没写出来2333

我凭借记忆记录一下笔试题,可能会有偏差

T1、翻转序列

有一个只包含有0和1的序列,每次可以选择翻转一个数字,此时它两边的数字也会跟着翻转,如果选择翻转index为0或者string.size()-1的数字则只会影响到它旁边的一个数。需要将所有的数字都翻转为0,输出最少的翻转次数

我的思路

我拿到这个题的想法就是每次遇到“11”序列则翻转,保证前面已经翻转的数字都为0,但无奈写完之后发现有“10101”这种序列, 查了好久才发现,最后没写出来。

标准思路
解法一:贪心
  • 对数列进行遍历每次遇到0则从他的下一位开始翻转,这样就刚好影响到它本身
  • 当对(0,string.size()-2)区间内的数字进行遍历完成后,如果最后一位为1则无法成功翻转,否则输出最少的翻转次数
int count = 0;
for(int i = 0; i < s.size()-1; ++i){
    if(s[i] == 1){
        s[i] ^= 1;  //翻转
        s[i+1] ^= 1;
        if(i + 2 < s.size())    //判断是否为倒数第二位
            s[i+2] ^= 1;
        count++;
    }
}
if(s[s.size()-1])
    return -1;
return count;
解法二:滑动窗口

可以考虑不做实际的翻转,只记录该位被翻转了多少次,而每一位是由周围2位影响的,所以需要维护一个队列来记录目前哪些位被翻转

int count = 0;
queue<int> q;
for(int i = 0; i < s.size(), ++i){
    while(!q.empty() && q.front() + 2 <= i)
        q.pop();    //剔除已经无影响的翻转
    if(q.size() % 2 != A[i]){    //判断是否需要翻转
        count++;
        q.push(i);
    }
}
while(!q.empty()){
    if(q.front() == s.size()-1){    //最后一位还需要翻转则无法成功翻转
        free(q);
        return -1; 
    }
    q.pop();
}
return count;
参考资料

Leetcode T995 K 连续位的最小翻转次数

T2、射箭打怪

这个题我只简单的看了一眼,无法保证完全正确
输入m与n,表示一共有m只箭与n个怪,并会给出每一只怪的体力值,每一只箭的攻击力和价钱,输出杀死全部怪的最少花钱数

我的思路

笔试的时候只是瞟了一眼,没有做,后来又想了一下,有一个大概的思路:用一个结构体存储箭,把箭按价钱排序,然后对每个怪遍历箭的list去寻找可以杀死它的箭并记录下价格,不确定题目是有放回还是无放回,对应的是用完的箭是否删除。不知道对不对,先写着,感觉如果还有面试应该会被问到。

一面

笔试第二天就安排了面试效率还是很高的,不像腾讯,都要一周了还没开始面

面试主要分为知识点考察和现场编程两个环节,知识点考察是通过电话来进行的,貌似是阿里那边有一个电话转接的软件,感觉通话质量一般;现场编程是通过邮箱发过来的链接进入,面试官那边可以看到你这边写的代码。
整个面试过程中知识点考察大概1h左右,现场编程30min吧,我这边由于网络原因所以中间花的时间比较多。

操作系统

  • 操作系统是如何进行进程切换的,请进程A切换到进程B是怎么样一个流程?
    • 操作系统是如何把进行从用户态切换到内存态?(软中断和硬中断)
  • 操作系统是在进行进程切换时的上下文切换是什么样的操作?
    • 一个进程在切换的时候会保存哪些资源?
  • 在Linux系统下怎么去创建一个新的进程?(fork)
    • fork在复制的时候会拷贝原进程的数据嘛(copy-on-write)
  • 写过多线程代码吗?(开始尴尬)
    • 多线程主要会遇到什么问题?(资源抢夺->死锁)
  • 死锁有什么解决机制?
  • 你了解一个进程在地址空间中会划分为什么区域吗?(往PE文件加载上去扯)
    • 你了解数据块中的堆内存和栈内存吗?
    • malloc分配的内存在哪?(自己挖坑)
      • 内存在堆里,变量存在堆里面,指向那块内存的指针在栈里面
  • 你了解malloc是怎么管理内存的吗?(假装不知道,先埋伏他一手)
    • 怎么去处理内存碎片的问题?
    • 这种处理方式有什么问题?
  • 你了解虚拟内存怎么映射到物理内存的吗?
  • 你有过socket编程的经验吗?(再次没写过)
    • 怎么对并发请求进行处理?
  • 你有了解IO复用的概念吗?(这个确实忘了)

Linux

  • 你了解Linux系统的基本操作吗?
    • 不了解,此路不通

编译原理

  • 你了解静态链接和动态链接的区别吗?
  • 简要叙述一下一个C语言程序编译生成机器码的过程
  • 编译整个过程有哪些具体的阶段?
  • 你了解词法分析语法分析吗

计算机网络

  • 从输入网址到浏览器显示是怎样的一个过程
    • DNS -> ARP -> HTTP -> HTTPS(再埋伏一手,把对称加密和非对称加密简单描述一下)
    • DNS协议底层是用什么协议(原来是问的传输层,这波亏了)
    • 请求DNS服务器的过程是怎样的?
  • 你了解Cookie吗?(开始扯自己的开发经历->MyBlog)
  • 你了解HTTPS加密的整个过程?
    • 终于来了!从自己对dewdrop的分析开始引入对HTTPS的了解,夹带私货成功
    • 为什么HTTPS不直接用非对称加密,而要先用非对称加密再用对称加密?
    • 非对称加密的公钥存在哪,怎么去拿?(签名和证书分不清了23333)
    • 你了解证书链的概念吗?(扯信任链,但实际上我不清楚)

数据库

  • 数据库你用过什么数据库?(用的多的是MongoDB)
    • 对比MongoDB和MySQL(关系型数据库和非关系型数据库)
    • MySQL不使用外键,自己维护关系的情况下和MongoDB有什么区别?(我觉得貌似确实没区别啊)
  • 你了解数据库的索引吗?
    • ObjectiveID就相当于主键
    • 你了解给一个属性加索引吗?(我???)
  • 你了解数据库的事务吗?
    • 果断我没学过数据库,下一个

Web

  • React框架解决了什么问题?
  • Vue跟自己手写js有什么区别?
  • 你了解过React Native框架吗?

编程语言

C++
  • 你用过C++的智能指针吗?
    • 你了解智能指针的实现原理吗?
  • 你了解C++的多态是怎么实现的吗?
JAVA
  • 你了解JAVA的GC机制吗?

其他

  • 你可以分享一下你最近看的一本技术书籍吗?
    • 话不多说《Metasploit渗透测试魔鬼训练营》,被评价接触范围广
  • 你对未来的规划是怎样的?是想直接工作还是读研?
    • 工作
  • 你有什么问题想问我?(标准结局)
    • 先扯一下对公司的各种问题
    • 我想知道一下你对我这次面试的评价(这个就不写了)

手撕代码

写代码是用的阿里伯乐在线评测系统,代码不用编译,就在白板上手写,没有自动补全,面试完后会把你的代码给你发过来,还挺贴心

  • 题目不是很难,感觉大多是考察代码规范以及思路
  • 之前在LeetCode上写过,基本是原题,LeetCode T8 字符串转换整数(atoi)
  • 这题我自己在大一暑假写过刷题笔记
  • 这次现场写的代码如下,自己面试后直接贴到LeetCode上去测过,直接AC了也是很奇妙
class Solution {
public:
    int myAtoi(string s) {
        if(s.size() == 0)
          return 0;
        int i = 0;
        while(i < s.size() && s[i] == ' ')
            ++i;
        if(i >= s.size())
            return 0;
        int exit = 0;
        int flag = 0;
        if(s[i] == '+'){
            ++i;
            exit = 1;
        }
        if(!exit && s[i] == '-'){
            flag = 1;
            ++i;
        }
        long long res = 0;
        while(i < s.size()){
            if(s[i] < '0' || s[i] > '9')
                break;
            res *= 10;
            res += (s[i] - '0');
            if(res >= INT_MAX)
              break;
            ++i;
        }
        if(flag){
            res = 0 - res;
            if(res <= INT_MIN)
              return INT_MIN;
        }
        if(res >= INT_MAX)
          return INT_MAX;
        int ans = int(res);
        return ans;
    }
};
评论 (4)