面试总结

265 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

记录一下格灵深瞳一面的情况

总我介绍

首先进行自我介绍

计算机基础

二进制减法实现

这个我在前几天的原码反码补码这个帖子中,为什么计算机使用补码计算,正好分析过,这里再说一下

  • 计算机减法是把加法换成减法进行运算,比如 2 - 1 = 2 +(-1)
  • 机器数就是二进制数,但是最高位是符号位。比如 1 = 0000 0001 , -1 = 1000 0001.这也就是原码。
  • 如果使用原码计算 2 + (-1) = 0000 0010 + 1000 0001 = 1000 0011 = -3.这样会出错
  • 为了解决这个问题,出现了反码。
  • 2 + (-1) = (0000 0010 + 1111 1110)反 = 0000 0001 = 1
  • 但是还会出现一个问题 +0 和 -0 的问题 +0 = 0000 000 ,-0 = 1111 1111。对计算机来说一个数字只能对应一个机器数,否则会在运算的时候出现错误。于是为了解决这个错误,出现了补码
  • 补码:
    • 我们这样设定,0对应的是+0。所以0的编码是0000 0000
    • 那么-0就不能表示0,人们就把-0 ~ - 127 整体向后偏移了1位,编程了 -1 ~ -128.至于怎么偏移,就是补码+1 变成反码。
    • 然后我们可以顺着推,1111 1111 是 -1 。那么-128 就是 1000 000了。
    • 至此解决了+0,-0的问题,而且int8的数据范围多了1个,变成了 -128 ~ 127。完结撒花

int8类型,-128 - 1的结果

明白了加法是怎么实现的就很好理解 -128 - 1 = 1000 0000(补)+ 1111 1111(补)= 0111 1111 =127。当然这样记太麻烦了,也可以这样记,把整个数据范围看成一个循环

image.png

mysql

  • mysql常见的搜索引擎

    • MYISM
    • Innodb
    • MEMORY
    • MEGRE
    • NDB
  • 为什么默认使用Innodb引擎

    • Mysql之前采用的引擎是MYISM,但是MYISM有个很大的缺点,就是不支持事务、不支持行级锁,如果一旦崩溃无法安全恢复
    • MYISM只支持表级锁,一锁就锁住了整个表,在并发情况下很不好
    • Innodb支持事务安全、支持行级锁,也就是说Innodb可以安全的进行数据崩溃恢复和回滚,并发表现更好
    • Innodb支持外键
    • blog.csdn.net/qq894351194…
  • 事务

  • Innodb为什么使用B+树

    • 这个在我为什么Innodb选择B+树索引也有分析,下面再分析一下。
    • B+树结构是一个多叉树,和二叉树相比,同样的数据树的高度更低,搜索效率就更高
    • 和B树相比,B+树的非叶子节点只存存储关键字,不存储数据,而B树存储关键字和数据。而叶子节点其实就在Mysql的页上面,这个是固定的。所以B+树的叶子结点的关键字就更多,同样多的数据,B+树的层级会更低
    • 然后B+树的叶子节点会有指针指向相邻的叶子节点,而B树没有。也就是说相比哈希和B树,B+树更适合做区间搜索
  • 回表查询

    • 想要查找的数据需要再次根据主键去聚簇索引中查找,就叫做回表查询

  • 介绍一下乐观锁还有悲观锁
  • Mysql的锁是乐观锁还是悲观锁
  • 乐观锁和悲观锁的区别在哪
  • Redis怎么实现分布式锁

go

  • 中间件是怎么实现的
  • 中间件Next方法停止了当前的中间件,去执行下一个中间件,怎么实现的?

算法

  • 手撸了两个力扣easy难度的题,不值一提
  • topk问题 -- 10亿个int型数据找出值最大的k个数据
    • 维护一个大小为k的小根堆,遍历的时候数据大于最小值,就删除最小值,替换维护这个小根堆。时间复杂度是 nlongk(这个是所有方法的下线)。 可以优化,使用分治+小根堆,分治可以使用并发实现,可以把时间缩短,但是还是要把所有数据再遍历一遍。
    • 分治+排序,每组取最大的m个值,然后这个最大的值再取k个值。时间复杂度是nlongn

项目

  • 项目有没有涉及高并发场景
    • 很遗憾我的项目没有这个,我也不知道怎么说