阿里 ICBU C/C++ (暑期实习生) 一面+二面经验

个人经历

  1. 大一参加微信小程序获西北赛区二等奖(队长身份)

  2. ACM-ICPC 两银一铜 ACM-CCPC:两铜 CF-rating: 1900+,18年暑假开始搞ACM

  3. C++项目经历:无,只有课设(黑窗口)

  4. 略懂前端,自己搭过博客,做过一两个小的项目(微信小程序)

对于答案比较固定的问题就不列出回答了,只写一下开放性问题的回答

一面

Time: 2020.4.4 (22:03-22:57)

  1. 大一参加微信小程序的项目相关:

    答: 当时刚学了前端,离提交作品仅剩20天,后端(PHP和Node)都还没学,只做了个类似 to do list 的小程序,数据存放在缓存中,不过在大二的时候做数据库的课设时用TP5搭建了一个商场类小程序(跟着imooc的七月老师学习的)

  2. C++11 有了解过吗?

    答: 有了解过,比赛中也用的很多,例如auto,unordered_map,>>优化等等,但是其他特性例如智能指针,右值引用几乎没有用过

  3. map的时间复杂度,底层,unordered_map的时间复杂度(unordered_map的时间复杂度答错了,在这之前一直不知道他的底层是哈希表,只知道它比map快)

  4. 红黑树是否了解,为什么有了AVL还要有红黑树?(说了一下红黑树的概念和性质,第二问不知道,答案应该是红黑树的复杂度更稳定,因为它的条件不如AVL严苛)

  5. hash表相关(没答全)

  6. 智能指针(当时不会)

  7. socket编程(完全没接触过)

  8. 多线程(没接触过,刚开始学操作系统,学校开课晚)

  9. ACM里面你主要负责那一块?(数据结构和图论)

  10. 讲一下最近做的你认为比较难的图论题目,比如网络流什么的(顺着面试官的思路讲了前几天刚训练的网络流题(其实应该可以换个简单一些的)2017西安ICPC-E,但其实当时并没有讲的很清楚...因为这个建模还算比较复杂的,而且电话面试只能靠口述)

接下来开始手搓代码

  1. 给一个满二叉树序列,构建二叉树(指针版本)

    1. 很容易想到了下标规律(根和左右子节点序号的二倍关系),但是用指针是真的难受,一不小心就掉进了陷阱
  2. 二叉树镜像反转

    1. 递归就可以了
#include<iostream>
using namespace std;
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };

void dfs(TreeNode *&rt, int id, int tot){
    if(rt == nullptr){
        rt = new TreeNode(a[id]);
    }
    int lson = id * 2;
    int rson = id * 2 + 1;
    if(lson  tot && a[lson] != 0){
        dfs(rt->left, lson, tot);
    }
    if(rson  tot && a[rson] != 0){
        dfs(rt->right, rson, tot);
    }
}
void reverse(TreeNode *rt){
    if(rt->left != nullptr){
        reverse(rt->left);
    }
    if(rt->right != nullptr){
        reverse(rt->right);
    }
    swap(rt->left, rt->right);
}

int main(){
    int a[1000], n;
    scanf("%d", &n);
    n = (1<<n) - 1;
    for(int i=1;i<n;i++){
       scanf("%d", &a[i]);
    }
    TreeNode * root =  new TreeNode;
    dfs(&root, 1, n);
    return 0;
}

因为面试官也搞过竞赛,最后又聊了聊竞赛和开发的区别(变量命名,全局开数组之类的),结束之前提醒我这几天学一下socket,进程线程相关,说二面会更加严格(天,有那么一丝丝激动)。


在一面过后二面之前的这四天里:

  1. 入门了Socket编程并总结到博客中

  2. 学习AVL和红黑树等细节操作(大概看懂了,并没有记住),了解红黑树的优势

  3. 学习智能指针

  4. 学习右值引用

  5. 学习进程和线程相关(看了看课本,从面经里面挖了一些可以看得懂的考点去准备了一下)

  6. 复习Linux命令,鼓起勇气重拾vim(因为比赛的缘故一直想学,学过,也放弃过)

  7. 复习TCP+UDP相关


二面

Time:2020.4.8 (20:01-20:54)

  1. 自我介绍

  2. 微信小程序项目相关(看来是有项目就一定会被问,不过这也是我写在简历里面唯一的项目)

  3. ACM学习过程与计算机基础知识学习过程的体会和经验

    答:ACM需要大量的练习,在后期做题重在思考,如果没有思路就会消耗掉大量的时间,知识多而且难需要总结+经常性复习。计算机基础知识虽然有分为学科,但是他们或多或少有些关联,日常学习要多将思考他们的联系和区别,应对考试复习要对课本知识有系统的总结和针对性的做题复习,但是针对实际应用,也和ACM刷题类似,要多练习和总结。遇到问题要寻求多种途径去解决。

  4. C++11,C++14,C++17(只对C++11有些了解...几乎和一面答得一样)

  5. vector和map等等,他们的底层是什么样的,各种操作复杂度?

  6. hash相关(没答全,我真是个憨憨)

  7. 智能指针(嘿嘿)

  8. 右值引用(还好刚看过)

  9. 多态如何实现(虚函数那一堆)

  10. 虚析构函数的必要性

  11. inline和宏的区别(答了一些,感觉没答全)

  12. extern有什么用

  13. 如何定位一个函数或者一个变量(依稀记得在VS里面按F12可以跳过去,但是面试官补问如果是Linux呢?一脸茫然)

  14. 你平时Linux用的多吗?(刷题用一用,基本命令知道一些)

接下来是手搓代码

  1. 单链表,存放整数,删除一个整数,要求近似复杂度

    此题有坑,经过面试官提示,逐渐意识到以下两点

    1. 删除的是一个整数,而不是一个节点(直接改变值就好了,并不需要改变前面那个节点的next)

    2. 近似复杂度,也就是不要求针对所有情况复杂度都是(面对特殊情况,要扫描)

struct Node{
    int val;
    Node* next;
};
Node* head;
void del(Node* head, Node* p){
    // 空链表的情况
    if(head == nullptr || p == nullptr) return;
    // 针对后面还有节点的情况
    if(p->next != nullptr){
        p->val = p->next->val;
        Node* tmp = p->next;
        p->next = tmp->next;
        delete tmp;
    } else if(head == p){//针对只有一个节点的情况
        delete head;
        head = nullptr;
        p = nullptr;
    } else {
        // 针对后面没有节点情况,需要改变前面的指向,要O(n)扫描
        while(head->next != p){
            head = head->next;
        }
        delete head->next;
        head->next = nullptr;
    }
}
  1. 基础
// 输出值
// why?: up cast
int main(int argc, char** argv){
    std::cout 25u - 50;
    std::cout 25u - 50l;
    return 0;
}

第一个输出-25,溢出处理(计算机组成原理基础知识)

第二个Linux环境输出-25

但是面试结束之后在Windows测试了一下,结果如下:

image.png

有大佬知道这个是因为什么嘛?

  1. 不用加减乘除实现加法(位运算)

这个题应该挺常见(网上一搜一大片),但是面试时第一次遇到,冷静下来跟面试官口嗨了一下数电里面进位加法器的原理,他说是对的,但是循环过程中i++也用到了加法

然后想了想,写了下面这个代码:

//不用加减乘除,实现整型求和
int sum(int a, int b) {
    if( (a & b) == 0){
      return a | b;
    } 
    else 
      return sum((a|b)-(a&b), (a&b)<<1);
}

(a|b) - (a&b) 可不就是 a^b嘛,但是我当时愣是没反应过来

最后面试官问将来有什么打算,我说想多尝试尝试,如果能继续深造还是要继续深造。紧接着他又问如果把我调到测试岗位,能不能接受

当然...能接受啊(我现在感觉自己就是一个无情的刷题机器,感觉其他什么都不会,不管研发还是测试,能有机会还是想都尝试尝试)

最后问了一下面试官,如果面试能成功,我这段时间还要学些什么?

  1. Linux

  2. 网络编程

  3. 搜索相关

  4. ...

好啦,面经告一段落了,不知道还会不会有第三面,但是经过这两次面试,发现了自己基础还有很大的不足,心中对ACM金牌还有向往,但现在觉得巩固巩固基础是非常重要的,虽然时间上确实有很大冲突,但是我不会再拿“我在搞ACM”这种理由来欺骗自己了。

希望这篇面经能够给各位带来一些帮助,也欢迎大家和我交流。这次面的是暑假实习生,知识还比较基础没有涉及到项目。而对于这些知识,很多面经里面都是重复的,对自己而言,最重要的还是沉下心来把这些知识重新整理一遍,方便之后复习。

理解为王,总结是为了之后更快的复习,不要害怕忘记,忘记=忘+记,忘是很正常的。(复习的时候,经常感觉自己学的不是工科而是文科,这大概就是实践太少的缘故吧)

最后祝各位offer++!!!~

update(4.15): 后来接到了测试部门的电话,经过几天的考虑之后还是打算不去了。

#阿里巴巴2021暑期实习##实习##面经##C++工程师##校招##阿里巴巴#
今夕的求职日记 文章被收录于专栏

记录2023年-2024年的笔试、面试问题~

全部评论
&lz太强了,这么多块牌
点赞 回复
分享
发布于 2020-04-08 23:47
&表达式中有无符号数就都是按无符号数运算,所以答案是比较大的正数
点赞 回复
分享
发布于 2020-04-09 00:20
联易融
校招火热招聘中
官网直投
linux 下 long int 8字节,windows 4字节。
点赞 回复
分享
发布于 2023-03-02 16:57 江苏

相关推荐

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