字节跳动查漏补缺

注:不保证都正确,只能根据个人主观来整理,以及各种搜博客。

1、 在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。

  1. int有4个字节,32位bit,最多可表示232个正整数,即4G个正整数(1G=230,1K=210)
  2. 采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。

###2、 TCP链接可以携带数据吗?
第三次握手,此时客户端已经处于ESTABLISHED状态。对于客户端来说,他已经建立起连接了,并且已经知道服务器的接收和发送能力是正常的。所以也就可以携带数据了

3、 m*n棋盘,有障碍

4、 bean的不同创建方式的生命周期?

5、 select 和 epoll的区别?

6、 http的头部字段

通过抓包可以分析出来

  1. Accept:设置接受的内容类型
  2. Accept-Encoding:设置接受的编码格式
  3. Accept-Language:设置接收的语言
  4. Cache-Control:设置请求相应链上所有的缓存机制必须遵守的指令。
  5. Connection:设置当前连接和hop-by-hop协议请求列表的控制选项。
  6. Host:设置服务器域名和TCP请求端口号
  7. Cookie:设置服务器set-Cookie发送的http cookie;

7、 get和post的区别

  1. GET参数通过URL传递,POST放在Request Body中
  2. GET请求在URL中传送的参数是有长度限制的,而POST么有。
  3. POST比GET更加安全,get方式会直接暴露在URL上,不能用来传递敏感信息。
  4. GET请求参数会保存在浏览器历史记录里面,而POST中的参数不会保留。
  5. GET在浏览器回退时是无害的,而POST会再次提交请求。

8、TCP的拥塞控制

四种算法:(1):慢开始 (2):拥塞控制 (3):快重传 (4):快恢复

  1. 发送方需要维护一个叫做拥塞窗口cwnd的状态变量,取决于网络的拥塞成都,并且动态变化。
  2. 发送发将拥塞窗口作为发送窗口,即swnd = cwnd;
  3. 维护一个慢开始门限ssthresh的状态变量
    1. 当cwnd<ssthresh时,使用慢开始算法
    2. 当cwnd>ssthresh时,停止使用慢开始算法,使用拥塞避免算法
    3. cwnd==ssthresh时,两者都可以使用。
  4. 慢开始:cwnd为1,发送然后收到确认之后,cwnd翻倍增长
  5. 拥塞避免:cwnd>ssthresh,拥塞窗口只能线性+1,比如当cwnd达到24时,24个报文段在传输过程中丢了4个,接收方只收到了20,一段时间后重传计时器超时了,发送方判断可能出现拥塞,更改cwnd和ssthresh
  6. 快速重传:发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传;
  7. 快恢复算法:发送方一旦收到三个重复确认,就知道现在只是丢失了个别报文。于是不启动慢开始算法,而是执行快恢复算法:将慢开始门限ssthresh和拥塞窗口cwnd调整为当前的一半,并开始执行拥塞避免算法。

9、怎么查看linux下那个进程打开了那些文件?

  1. lsof:列出被进程所打开的文件信息
  2. lsof -p 进程号 :列出某个进程打开了那些文件

10、多个有序数组的合并,并求时间复杂度

  1. 使用堆排序,假设有m个数组,那么构建m的小顶堆,每次从堆中取最小值,并将堆中最小值去掉,然后堆中加入该数组的后一个数,当一个数组遍历完的时候,将一个无穷大的数加入到堆中,直接m个数组扫描结束。
    复杂度n(log(m))
  2. 将所有元素放入到一个数组中,直接排序,nlog(n)

11、1000瓶药水 一瓶有毒 小白鼠喝了有毒的会有反应 十个小白鼠 怎么找到有毒的那瓶

通过10位二进制(2^10=1024)进行编码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YmQcGQsb-1594709549952)(zhili1.png)]
然后让十只老鼠分别喝各个位上的水(位上为1的样本组合),老鼠死了,对应水编号-1,没死对应水+1,找到小于0的则那瓶水就是好的。

12、无序数组求中位数

思想:最小堆:数组的前(n+1)/2个元素建立一个小顶堆。然后,对于下一个元素,和堆顶的元素比较,如果小于等于,丢弃之,接着看下一个元素。如果大于,则用该元素取代堆顶,再调整堆,接着看下一个元素。重复这个步骤,直到数组为空。

13 数字证书

数字证书-验证公钥所属的用户身份

14 Yong GC频繁怎么调?

由于新生代空间较小,Eden区很快被填满,就会导致频繁Minor GC,因此可以通过增大新生代空间来降低Minor GC的频率。

15 进程的调度算法

  1. 先来先去服务
  2. 时间片轮转法
  3. 多级反馈队列算法
  4. 最短进程优先
  5. 最短剩余时间优先
  6. 最高响应比优先
  7. 多级反馈队列调度算法

16 协程和线程

  1. 协程和进程、线程的概念不一样,协程是可以看做是一个类函数或者一块函数中的代码,可以在一个主线程里面创建多个协程
  2. 与函数调用不一样的是,协程可以通过暂停或者阻塞的方式将协程的执行挂起,而其他的协程继续执行,其他的协程可以唤醒挂起的协程,协程的挂起和唤醒是通过一个调度器来完成的。
  3. 相比于线程,协程少了同步资源竞争带来的CPU上下文切换,I/O密集型的应用比较适合使用。

17 cpu密集型和I/O密集型的区别

  1. CPU密集型:进程大量的时间花在计算上面(图片处理、视频转码等)
  2. I/O密集型:进程在input和output上花费了太多的时间(搜索引擎)。

18、CPU二级缓存

二级缓存主要是协调一级缓存和内存之间的工作效率。CPU首先使用的是一级缓存,等以及缓存不够时,就开始使用二级缓存。

19、虚拟内存的作用

  1. (缓存):将主存视为一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据
  2. 内存管理:为每个进程提供了一致的地址空间,简化内存管理
  3. 内存保护:保护了每个进程的地址空间不被其他进程破坏。

20 TIME-WAIT的作用

主动关闭连接的一方会进入TIME-WAIT状态(最后一次)2MLS

  1. 可靠实现TCP全双工连接的终止:如果因为最后一次ACK丢失,服务器重发FIN,这是客户端处于CLOSED状态,那么客户端将相应RST分节,B端收到之后就会解释成为一个错误(java:SocketException)
  2. 允许老的重复分节在网络中消逝:TCP协议不允许处于TIME-WAIT状态的连接启动一个新的可用的连接,这个状态持续2MLS,可以保证旧的新号 已经在网络中消逝。(TCP优化:tcp_tw_reuse、tcp_tw_recycle、tcp_timestamp:重用)

21 键和索引的区别。

  1. 主键一定是唯一索引,唯一索引并不一定是主键
  2. 一个表中可以有多个唯一索引,但只能有一个主键。
  3. 主键列不允许空值,而唯一索引列允许空值。

22 Redis如何选择合适的持久化方式。

  1. 如果更关心的是数据完整性,那么选择AOF
  2. 如果可以承受数分钟以内的数据丢失,那么选择RDB
  3. 一般来说可以同时使用两种,优先级是先加载AOF(Redis重启的时候)

23 Redis的底层数据结构

  1. SDS(简单动态字符串):C语言实现的,定义了自己的字符串(sdshdr),维护了字符串长度,确保了能够快速获取(c字符串长度要遍历),优化空间分配策略,节省内存;

  2. 链表:Redis的列表(List)就是用到了链表;双端链表,维护了长度(n(1)获取长度)

  3. 字典:又称为map,保存键值对,Redis键值对存储就是用字典来实现的,散列(Hash)的底层实现之一也是字典。字典的底层是基于哈希表实现的,一个表中可以有多哥哈希表节点,每个节点保存字典中的一个键值对。

  4. 跳跃表:Sorted Set有序集合的底层实现之一,当成员比较多的时候,使用跳跃表的结构会比较快。

  5. 整数集合(intset):intset是集合(Set)的底层实现之一,如果一个集合只包含整形元素,且数量不多,就会使用整数集合作为底层实现;

  6. 压缩列表:了节约内存而开发的顺序型数据结构,里面有长度维护,List列表和Hash散列的底层实现之一。

  7. String:SDS简单动态字符串

  8. List:压缩列表+双端链表

  9. Hash:压缩列表+字典实现的哈希对象(数组+链表:处理冲突)

  10. Set:intset+hashtable

  11. Zset:ziplist+跳跃表实现的有序集合对象;

24 如何实现ThreadLocal

使用Map,然后key是Thread的地址,value是变量;

25 Redis的主从复制原理?

  1. 建立连接

    1. 保存主节点信息:masterhost:存ip地址;masterport:存端口。主节点执行slaveof,从节点返回ok;
    2. 建立socket连接:主节点收到从节点的socket连接之后,就为该节点设为客户端状态
    3. 发送ping命令:从节点给主节点发送ping命令首次请求,目的是:检查socket连接是否可用。
    4. 身份验证:从节点设置masterauth选项
    5. 发送从节点端口信息:从节点向主节点发送监听的端口号,用于info Replication;
  2. 数据同步阶段:从节点向主节点发送psync命令,同步阶段是主从复制最核心的阶段,根据从节点当前状态的不同,分为全量复制和部分复制。

  3. 命令传播阶段:数据同步阶段完成之后,主从节点进入命令传播阶段;这个阶段主节点将自己执行的写命令发送给从节点,从节点收到命令并执行,从而保证主从节点数据的一致性。此外还维持着心跳机制。

26 3XX 状态码 对应的是什么?

  1. 1XX:信息状态码
  2. 2XX:成功状态码
    1. 200:一切ok
  3. 3XX:重定向状态码
    1. 301,永久性重定向,请求的资源被分配了新的URL,以后都使用这个
    2. 302 临时重定向,请求的资源被分配了新的URL,本次使用这个
  4. 4XX:客户端错误状态码
    1. 400:bad request:服务端无法理解客户端发送的请求。
    2. 403:Forbidden 不允许访问那个资源。
  5. 5XX:服务器错误状态码
    1. 500:Internal Server Error:貌似内部资源出故障了,服务端执行请求时发送异常
    2. 503:服务器暂时无法处理请求。

27、Spring中从url中获取参数的注解是什么?

  1. @RequestParam
  2. @RequestBody

29、 redis集群模式,实现了分布式Session怎么能实现正确登录的?

crc16算法,通过key值对某一个数求余,然后找到具体的集群中的节点进行存取。

30、 一致性哈希问题。

在redis集群中,如果使用key%服务器数量取模的话,如果服务器增加了一个,可能导致之前的key取模不是对应相同的服务器,redis使用了对232的方式进行取模,利用主机的关键字比如ip之类的对这个取模。然后对232个节点构成环

31、mysql中什么时候才需要建立索引?

  1. 首先要确定优化目标,在什么样的业务场景下,表的大小等等。如果表比较小的话,可能都不需要加索引。
  2. 哪些字段可以建索引,一般都where、order by 或者 group by后面的字段。
  3. 记录修改的时候需要维护索引,所以会有开销,要衡量建立索引之后的得与失。

32、建单列索引可能有的索引没用到?

EXPLAIN SELECT * FROM student WHERE Sname=‘张三’ AND Ssex=‘男’;例如建立了两个单例索引,可能只使用到了其中的一个。

33、索引失效?(select * from table where a=‘a’)

数据表是在太小了,做一次全表扫描比做索引键的查找来得快多了。当表的记录总数小于10且记录长度比较短时通常这么做。

34、 索引原则

索引越少越好:主要在修改数据时,第个索引都要进行更新,降低写速度。

35、http是无状态的,怎么让它有状态?》

使用cookie和Session

36、三次握手的目的?

同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。

37、hashMap中的扩容因子为啥是0.75?

javaDoc中:对于0.75的默认调整阈值,泊松分布的概率质量函数中参数lambda(事件发生的平均次数)的值约为0.5;
ttp是无状态的,怎么让它有状态?》
使用cookie和Session

36、三次握手的目的?

同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。

37、hashMap中的扩容因子为啥是0.75?

javaDoc中:对于0.75的默认调整阈值,泊松分布的概率质量函数中参数lambda(事件发生的平均次数)的值约为0.5;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值