首页 > 字节跳动客户端研发base上海提前批一二三面面经(已意向书)
头像
芝麻开萌
编辑于 2021-07-28 15:49
+ 关注

字节跳动客户端研发base上海提前批一二三面面经(已意向书)

楼主白嫖了牛友很多面经,获益良多,在此回馈。个人信息:某985本科,HW工作half year然后去读研,本硕间隔一年目前研究生毕业。
一面 30min
面试官是个小可爱类型的男生,应该也是进公司没几年的,估计比我大三四岁这样,不过根据HR说很多leader都是些年轻人,所以无法判断是不是leader
1. 自我介绍
2. 为什么离开HW去读研究生(提升自己;毕业之前就有所准备)
3.非科班出身为什么选择互联网(喜欢自己的代码被accept的感觉,写代码带来成就感)
4.为什么选择客户端部门(HW和硕士期间都有客户端开发经历;感兴趣;适合自己能力)
5.知道哪些设计模式(我说比较熟悉工厂模式,单例模式,装饰器模式),问了下要不要说它们的定义,面试官说不用
6.问我装饰器模式的应用场景(我的回答是在不对原有功能模块增删代码的情况下,在其外部进行包装/装饰,以实现工作中可能出现的新的需求),面试官摇头,感觉自己讲错了(但是不知道错在哪,然后再复述一遍,还是摇头,有点慌),我补充了一句就像在python中使用装饰器差不多,面试官切换问题。(各位为我解惑?)
7.问我C++面向对象的3个特性(把所有事物当作对象,抽象出对象共有的属性和对对象属性共有的行为,封装成类,在类的基础进一步上实现继承、多态)
8.具体讲一下C++多态(我主要讲了怎么实现的,利用virtual限定使得父类指针能调用到子类的成员函数,具体通过虚函数表;虚函数讨论过程中出现分歧,我说在创建对象时会先继承父类虚函数表,然后如果子类中定义了同名虚函数再对这个虚函数表的函数地址进行覆盖,面试官摇头,不太认同,有点慌)
9. url的渲染过程
10.POST请求和GET的区别(进一步问了是否POST的参数只能放在http request body中?我回答既然你这么问了,答案应该是否,但我不懂啊...我只知道一般都放在request body中)
11.HTTP header中的内容(分http request header和http response header,以http request header为例,主要有cache-control,cookie,connection,content-type,content-length,host,date还有一些以accept开头的如accept-charset、accept-encoding等,然后还额外说了下request line中还存放了http协议版本,http方法和url)
12. 给了一个场景:如何提升视频upload到抖音app上的成功率?(WTF一开始有点懵,我就想参考一下tcp的可靠传输的几个机制:首先最好能在一个优良的网络环境中,没有拥塞;通过服务器发送的信号来控制客户端的上传速率,以防服务器负载过大出现丢包等(这点展开讨论了一下);然后问我还有吗,我想应该是没回答到点子上,我憋了一会说没有了)现在想想还可以采用好的压缩办法让上传的文件大小小一些,不知道可不可行
13. 编程:LEETCODE 107 二叉树的层序遍历2 因为刷过,所以4分钟没到就过了
class Solution {
public:
    vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
        queue<TreeNode *> nodes;
        vector<vector<int>> res;
        if(!root) return res;
        nodes.push(root);
        bool flag=true;
        while(!nodes.empty()){
            int size=nodes.size();
            vector<int> interRes;
            for(int i=0;i<size;++i){
                TreeNode *cur=nodes.front();
                nodes.pop();
                interRes.push_back(cur->val);
                if(cur->left) nodes.push(cur->left);
                if(cur->right) nodes.push(cur->right);
            }
            if(flag) res.push_back({interRes.begin(),interRes.end()});
            else res.push_back({interRes.rbegin(),interRes.rend()});
            flag=!flag;
    
        }
        return res;
        // write code here
    }
};
二面 40min
1.自我介绍
2.C++的互斥量用什么实现?mutex类;问除了mutex,C++的锁知道哪些(我说虽然写过C++线程池,印象不深了,但是知道数据库锁,转而问我数据库锁,面试官好人)
3.数据库锁(乐观锁、悲观锁,悲观锁里又有共享锁和排他锁,行锁和表锁属于排他锁,都详细解释了一下定义)
4.进程通信方式?(管道、信号量、共享内存、消息队列、套接字,每个都略微展开了一点)
5.为什么四次挥手要比三次握手多一次(服务端FIN和ACK分开发,可能还会有资源要传输,不能你客户端说结束就结束)
6.HTTP的状态码(5类,1开头2开头...5开头)
7.进程和线程区别(老八股文了)
8.系统为什么能够在存储上支持多进程(虚拟内存,说了下定义)
9.TCP,UDP区别
10.操作系统的内存管理(分页、分段,并分别讲了下定义和区别)
11.单例模式熟悉吗,使用C++手撕代码
12.编程:面试官手写题:链表相加 LEETCODE上也有类似题目 给了1->2->3->4和2->4->6需要输出一个链表:1->4->8->0,其实就是模拟整数相加,然后还需要把他给的Node类构造补充完整
当时有点想当然了,一个个把数字pushback到一个string里,然后利用系统库函数atoi来计算整数相加结果,然后面试官把链表扩展成1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1->1,问我你的代码有什么毛病,我说当然是atoi不能用了
他要我写第二个方案,我就不走捷径老老实实用vector来做,写了50多行代码,面试官很厉害,一眼看出代码bug,大概有两三个?(要我大脑里编译程序运行一下这个输入,然后运行结果是不是对的),我说结果没错啊,他直接说结果是这个,哦,一个if else没写完整。后来面试结束后自己又优化了一下代码,改用栈来做感觉更简洁:
    Node* add(Node *node1,Node *node2){
        stack<int> nodes1,nodes2,res;
        while(node1){
            nodes1.push(node1->value);
            node1=node1->next;
        }
        while(node2){
            nodes2.push(node2->value);
            node2=node2->next;
        }
        int cb=0;
        while(!nodes1.empty()||!nodes2.empty()){
            int n1,n2;
            if(!nodes1.empty()){
                n1=nodes1.top();nodes1.pop();
            }else n1=0;
            if(!nodes2.empty()){
                n2=nodes2.top();nodes2.pop();
            }else n2=0;
            if(n1+n2+cb>=10) {
                res.push(n1+n2+cb-10);
                cb=1;
            }else{
                res.push(n1+n2+cb);
                cb=0;
            }
        }
        if(cb==1) res.push(cb);
        while(!res.empty()){
            if(!res.top()) res.pop();
            else break;
        }
        if(res.empty()) return nullptr;
        Node *head=new Node(res.top()),*cur=head;res.pop();
        while(!res.empty()){
            cur->next=new Node(res.top());res.pop();
            cur=cur->next;
        }
        return head;
    }
三面大佬面,面试完才知道是个不折不扣的大佬,不是一般的大佬 30min
开局直接说我们掠过自我介绍和项目介绍这些繁文缛节,感觉有点不一般
1.看这个hello world C++代码,如果程序在main函数第一行设置断点,但是程序没有到断点就崩了,什么原因?思考了一下,回答可能是全局变量等内存分配、或者类加载出了问题?
2.看这个cout<<"Hello World"<<endl是怎么把hello world显示到屏幕上?我回答是先把这个字符串以字节流输入到输出缓冲区,然后endl会清空缓冲区然后输出;继续问然后呢?什么然后WTF?
3.从桌面上打开QQ具体是怎么样?回答桌面上的是快捷方式,实际上引用了一个特定目录下的可执行文件,双击后cpu运行二进制代码,然后输入账号密码登陆,也不知道答道所有点子上没
4.静态链接库和动态链接库区别?ORZ,复习看到过,但没留意,只能说了解这两个名词,但忘记具体的了,凉凉
5.代码从编写到运行经过的步骤?预处理、编译、汇编、链接,进一步问我编译这个过程从.i文件到汇编代码具体是怎么个过程,回答没学过编译原理不知道(第一面也是这个类似问题,回答也是这样),凉凉
6.手撕代码:LEETCODE 25 k个一组翻转链表
2分钟写完代码如下:
Node *reverseNodes(Node *head,int k){
    if(!head) return head;
    Node *cur=head;
    vector<Node *> nodes;
    while(cur){
        nodes.push_back(cur);
        cur=cur->next;
    }
    for(int i=0;i<nodes.size();i+=k){
        if(i+k>=nodes.size()) reverse(nodes.begin()+i,nodes.end());
        else reverse(nodes.begin()+i,nodes.begin()+i+k);
    }
    for(int i=0;i<nodes.size()-1;++i){
        nodes[i]->next=nodes[i+1];
    }
    nodes[nodes.size()-1]->next=nullptr;
    return nodes[0];
}
然后问我测试一下手写一下输入,然后输出看看。我说就是强制给链表加索引,利用reverse来swap指针,因为swap的不是具体对象而是指针,所以时间效率还是可以的。
写完一身轻松,心想代码写的快应该能弥补回答问题不足,大佬一句你这代码不对啊,我要考察你的不是这个,瞬间心情跌入谷底
他说我要考察你的链表操作,指针换来换去的,你写的不是这个。。。再用链表操作写一次。。
我呆住了,我说本来leetcode上就是我这样写的,还是没能避免重写代码...我又说既然都写出来了,输出也是对的,没必要这样吧...还是让我写
结果磨蹭了10分钟没写出来(只写了个反转链表的递归),大佬看我磨磨蹭蹭说要不下一题?我欣然答应
接下来两个开放题:
1.喜欢什么样的人?讨厌什么样的人?和讨厌的人一起工作你会怎么做?
2.分配给你的任务两个星期才能做完,领导要求一个星期做完,你会怎么做?(分类讨论)
三面很多要点都没回答出来,感觉不好,面完感觉凉凉,但结果有点惊喜通过了,等待意向书中。
总的来说三面的面试官都非常nice,会引导问题,不会嫌弃你回答不出,二面的面试官一看就是老好人了,感谢三面大佬放我一马,只是我太菜了没回答出来感觉自身还有很多计算机方面的知识可以补充。
分配给我的字节实习HR人非常好,点名表扬。
感谢字节爸爸能给我这么一个机会,也欢迎大家加入字节,目前提前批只剩4天。
7.28日更新,已拿到意向书,感谢字节

更多模拟面试

全部评论

(7) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

热门推荐