字节跳动一面(感觉凉凉)
1. 自我介绍;
2. 进程地址空间;
3. 了解多态吗?虚函数底层?虚函数表是每个对象有一份还是每个对象有一份?虚函数表存放在哪个位置?
4. 了解编译原理吗?文本到可执行文件过程?
5. 讲一下静态链接和动态链接;既然动态链接内存中有一份,那多个程序都使用这个动态链接库,可以修改里面东西吗?
6. 了解网络吗?用过TCP和UDP吗?TCP和UDP区别;
7. 讲一下TCP通信socket,客户端和服务端都做了什么;
8. 服务端和客户端什么时候建立三次握手;
9. Listen有什么用?
10. TCP怎么确保可靠的;
11. 拥塞控制了解吗?讲一下;
12. Http了解吗?有哪些请求方法(忘了具体啥意思),回答(get,post,head),能再详细具体讲下吗?
13. Https了解吗?
14. 数据库学过吧?知道哪些数据库?
15. 写一个sql吧,两个表,有一个字段相同,怎么找到交集; join
16. 数据结构了解一下吧?vector讲一下;
17. STL用过吧,有哪些,底层实现;
18. 二叉树有哪些遍历方法?
19. 二叉平衡树和二叉树区别?
20. (二叉平衡树了解不多)那你讲一下红黑树,为什么用红黑树不用二叉平衡树;
21. B树和B+树,那和二叉平衡树区别;
22. 两个编程题:
寻找重复数
//空间复杂度O(n)
// int findDuplicate(vector<int>& nums) {
// unordered_set<int> temp;
// for(int val : nums){
// if(temp.insert(val).second == false){
// return val;
// }
// }
// return -1;
// }
//思路1:用快慢指针判断:创建两个指针slow和fast同时指向头节点,
// 然后slow每次向后遍历一个节点,fast每次向后遍历两个节点,如果单链表没有环的话那么slow
// 将永远追不上fast,而如果单链表有环的话slow就会追上fast。第一次相遇之后,把指针slow拉回到链表的起点,
// 然后把fast的速度改为每次走一步即和slow速度相同,fast把第一次相遇点作为起点,
// 那么当slow和fast再次相遇的点就是圈的起点 https://blog.csdn.net/weixin_39789689/article/details/82421684
// int findDuplicate(vector<int>& nums){
// int fast = 0,slow = 0;
// do{
// fast = nums[nums[fast]];
// slow = nums[slow];
// }while(fast != slow);
// slow = 0;
// while(fast != slow){
// fast = nums[fast];
// slow = nums[slow];
// }
// return slow;
// }
//silu2:采用二分法,先计算mid,然后统计数组中小于等于mid元素个数K,若K<=mid说明重复值在[mid+1,n]之间,否则
// 重复值在[1,mid],使用抽屉原理,是由于重复元素导致两遍不平衡,如果无重复元素,两边个数是一样的,
// 然后依次类推,直到搜索完成,此时的low就是我们要求的重复值。
int findDuplicate(vector<int>& nums){
int l = 0, r = nums.size();
int m = 0;
while(l < r){
m = l + (r - l) / 2;
int count = 0;
for(int i = 0; i < nums.size(); ++i){
if(nums[i] <= m){++count;}
}
if(count <= m){
l = m + 1;
}
else{
r = m;
}
}
return l;
}
实现一个计算器 + - * / ()#字节跳动##C++工程师##提前批##校招#