字节跳动后台开发 一二面面经
字节跳动教育部门-在线教室 后台开发实习生
一面:
- 面试官介绍部门,自我介绍
- C++类型转换 static_cast, const_cast, reinterpret_cast, dynamic_cast
- dynamic_cast 可以从子类指针转父类指针吗?
- 面向对象,封装,继承,多态,介绍一下,这三者的意义分别是什么,这样做优势在哪?
- 给一分钟时间阅读代码,回答问题:
/* * 5.1 A* x = new B() 的构造过程 * 5.2 输出时什么?x->foo(); 执行的过程是怎么样的?虚表是什么时候生成的? * 5.3 x 内存里边除了虚指针还有什么?描述一下 x 的内存分布式什么样的? * 5.4 B类的对象内存模型是怎么样的?Member内存模型是怎么样的?sizeof(x)是多少?sizeof(B的对象)是多少?为什么? * 5.5 delete x; 整个过程是怎样的?B,A两个类都没写析构函数,会怎么样?delete x 会调用到B的析构函数吗?会发生内存泄漏吗?怎么改可以避免内存泄漏? * 5.6 只在 A 类中添加一个虚析构函数可以避免内存泄漏吗?为什么?整个过程是什么样的? * 这个地方被面试官绕的很晕。。。面试官问题都很犀利 */ class Member { public: Member() { m = new int(); } ~Member() { delete m; std::cout << "member" << std::endl; } private: int* m; }; class A { public: virtual void foo() { std::cout << "foo" << std::endl; } }; class B: public A { public: void foo() { std::cout << "b foo" << std::endl; } private: Member m; }; int main() { A* x = new B(); x->foo(); delete x; }
6. C++11,14了解吗,只了解C++11
7. 拷贝构造函数使用场景有哪些?
8. 左值和右值概念,一般什么样的东西会是一个右值?举一个右值的例子
9. STL中map和unordered_map 区别?
10. select, poll, epoll对比
11. 线程间同步方法
12. 哈希表介绍一下,冲突解决
13. 二叉搜索树结构,怎么证明二叉搜索树的中序遍历是有序的,证明一下
算法题:
1. 判断树是否为一个二叉搜索树(遍历写出非递归,在一个while循环里就能判断出来是否有序,不需要其他的循环,要求15分钟之内写完) 2. 数组中出现频率最高的K个数 (要求12分钟分钟之内写完)第一个算法题不难,但是写了一半面试官就不让写了,说结构太乱,代码风格不行,不易理解,被怼了好久。
第二个题我先说了下思路,感觉说的思路没问题,不知道是不是面试官听错了,又被怼一顿。
面试官说没看到我的一点代码能力,如果我能把第二题写的很好的话就帮我推二面,写不好就算了。
然后写第二个题时压力特别大,最后写的也一般(代码不够规范,for循环里写了两个if判断),用面试官的话来说就是很不漂亮,给我两分钟就修改,修改了之后他说还行,最后他也帮忙推了二面。
算法题并不难,但是就是有时间限制,还特别注重代码规范,之前写算法题从来没注重过这种东西,弄的很混乱,然后面试官还会给压力,搞得很焦虑🤣
二面(5分钟之后):
- 实习,项目介绍
- 面试官应该之前没看过我简历,我说用C++不会Go,面试官很惊讶🤣
- hash解决冲突方式
- 链地址法如何实现,怎么设计,数据结构是什么样的,链表节点时什么样的,节点里的val是什么类型
- 两个队列实现栈
-
算法题:
// 一个先递增后递减序列,找出中间增减趋势改变的数