字节跳动(客户端开发-教育)
一面 9.22 45min
- 自我介绍
- 程序在内存中分配
int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i<=3; i++){ arr[i] = 0; printf("hello world\n"); } return 0; }
输出结果是什么?
变量分配在哪里?
栈的特点?i和arr在栈上的分配情况详细介绍?(一块内存区从高到低)
“地址递减”编址方式分配内存:编译器编译程序时,按变量声明先后,从可分配内存中从高地址向低地址分配内存。(其实是栈内存区的编址方式)
程序中引用了arr[3]————数组下标越界(VC++6.0编译器可以检查出显示的下标越界,但是不检查隐式的下标越界)。循环内部会将所谓的arr[3]置0,而arr[3]实质上就是i,导致程序最终死循环。
长度为n的数组,获取第m个元素的地址,计算机是怎么计算的?arr_m_address = arr + m * sizeof(arr[]) arr[0]=0; //0xf0 //低地址 arr[1]=0; //0xf4 arr[2]=0; //0xf8 i=0; //0xff //高地址
- 链表来实现LRU缓存淘汰策略?
时间复杂度:o(n)
优化策略:hashmap
key/value分别是什么? - 说一说http,挑重点说
应用层 web页面请求 底层基于TCP
GET POST DELETE等方式
TCP三次握手
80端口
状态码 1xx 2xx 3xx 4xx 5xx
HTTPS SSL握手 443 - HTTP1.1 和2.0区别?
1、多路复用
HTTP2.0使用了多路复用技术,做到同一个连接并发处理多个请求,且并发请求的数量比HTTP1.1大了好几个数量级。HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但创建TCP连接本身也是有开销的。
2、头部数据压缩
在HTTP1.1中,HTTP请求和响应都是由状态行、请求/响应头部、消息主体三部分组成。一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件,但状态行和头部却没有经过任何压缩,直接以纯文本传输。随着Web功能越来越复杂,每个页面产生的请求数也越来越多,导致消耗在头部的流量越来越多,尤其是每次都要传输UserAgent、Cookie这类不会频繁变动的内容,完全是一种浪费。
HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
3、服务器推送
服务端推送是一种在客户端请求之前发送数据的机制。网页使用了许多资源:HTML、样式表、脚本、图片等等。在HTTP1.1中这些资源每一个都必须明确地请求。这是一个很慢的过程。浏览器从获取HTML开始,然后在它解析和评估页面的时候,增量地获取更多的资源。因为服务器必须等待浏览器做每一个请求,网络经常是空闲的和未充分使用的。
为了改善延迟,HTTP2.0引入了server push,它允许服务端推送资源给浏览器,在浏览器明确地请求之前,免得客户端再次创建连接发送请求到服务器端获取。这样客户端可以直接从本地加载这些资源,不用再通过网络。 - HTTP报文格式?
HTTP的请求报文包括:请求行(request line)、请求头部(header)、空行和请求数据(request data) 四个部分组成。
请求行包括:请求方法,URL(包括参数信息),协议版本这些信息(GET /admin_ui/rdx/core/images/close.png HTTP/1.1);
请求头部(Header)是一个个的key-value值,比如
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
空行(CR+LF):请求报文用空行表示header和请求数据的分隔
请求数据:GET方法没有携带数据, POST方***携带一个body - SSL握手过程?
- 介绍虚拟内存
- 虚拟内存解决了什么问题
内存空间有限;
多进程同时; - 介绍页表设计
- 手撕:判断是否是镜像二叉树
给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 #include <bits/stdc++.h> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x):val(x),left(nullptr),right(nullptr) {} }; bool myequal(TreeNode* r1,TreeNode* r2) { if(r1==nullptr && r2==nullptr) return true; if(r1==nullptr || r2==nullptr) return false; if(r1->val!=r2->val) return false; return myequal(r1->left,r2->right)&&myequal(r1->right,r2->left); } bool is(TreeNode* root) { if(root==nullptr) return true; return myequal(root->left,root->right); }
非递归的方法?
- 智力题:
条件:
1.64匹马
2.8个赛道
3.每次比赛只能知道比赛结果名次,不能知道具体时间
求:用最少的比赛次数,找出最快的4匹
11场
8 + 1 + 1 + 1