字节跳动面试总结-3.18

字节跳动面试总结

字节跳动是全球第一家将人工智能应用到主产品的科技公司。全系产品矩阵包括今日头条、抖音、西瓜视频、火山小视频、TopBuzz、Faceu激萌、图虫、懂车帝等多款产品。截止2019年1月,字节跳动旗下全线产品日活超过6亿,月活超过10亿。字节跳动也在积极进行国际化部署,产品覆盖150多个国家和地区,75个语种,在40多个国家和地区排在应用商店总榜前列。

字节跳动面试总结-3.18_第1张图片

面试信息

  • 面试岗位:Java后台开发实习生
  • 面试形式:牛客平台视频面试

考察内容

我们主要考察通用型的业务问题和过往的项目经历
价值观和软性技能也是我们选择人才的重要因素

  • 设计模式
  • SSM
  • 分布式
  • 系统设计
  • 项目
  • Java基础&多线程&JVM
  • 操作系统
  • 计算机网络
  • 数据库
  • 数据结构与算法

第一轮

1.了解Java内存结构吗?

Java程序执行的流程

  • Java源代码文件(.java)会被Java编译器编译为字节码文件(.class),由Java虚拟机中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。

  • 在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。

  • 因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)。
    字节跳动面试总结-3.18_第2张图片
    运行时数据区分为几个部分

  • 根据JVM规范,JVM内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。

名称 特征 作用
程序计数器 占用内存小,线程私有,生命周期于线程相同 字节码行号指示器
虚拟机栈 线程私有,生命周期与线程相同,使用连续的内存空间 Java方法执行的内存模型,存储局部变量表、操作栈、动态链接、方法出口等信息
线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址 保存对象实例,所有对象实例(包括数组)都要在堆上分配
方法区 线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译的代码
运行时常量池 方法区的一部分,具有动态性 存放字面量及符号引用

字节跳动面试总结-3.18_第3张图片

2.HTTP状态码有几种?

  • HTTP:超文本传输协议,定义了客户端与服务器端通信时,发送数据的格式

  • HTTP的特点

    1. 基于TCP/IP的高级协议
    2. 默认端口号:80
    3. 基于请求/响应模型:一次请求对应一次响应
    4. 无状态性:每次请求之间相互独立,不能交互数据
  • 版本区别:

    • 1.0:每次请求都会建立新的连接
    • 1.1:复用连接
  • HTTP状态码:

    当用户访问一个网页时,浏览器会向服务器发出请求。当浏览器接收并显示网页前,网页所在服务器会返回包含HTTP状态码的信息头,用以响应浏览器的请求。

    • 200-请求成功
    • 301-资源被永久转移到其他服务器
    • 404-请求资源不存在
    • 500-服务器内部错误
分类 描述
1** 信息,服务器收到请求,需要继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

3.TCP/IP 四层模型

编号 名称 描述 协议
4 应用层 提供应用程序之间的通信 HTTP,FTP,SMTP
3 传输层 建立主机之间端到端的连接 TCP,UDP
2 网络层 寻址和路由选择 IP,ICMPARP
1 网络接口层 提供介质访问、链路管理 各种物理通信接口

4.TCP和UDP的区别

区别项 TCP UDP
协议 面向字节流传输协议 面向报文传输协议
可靠性 可靠 不可靠
连接性 面向连接 无连接
报文 面向字节流 面向报文
双工性 全双工 一对一、一对多、多对一、多对多
流量控制 滑动窗口
拥塞控制 满开始,拥塞避免;快重传,快恢复

5.MySQL数据库引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统使用数据引擎进行创建、更新、查询、删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等。

InnoDB存储引擎

InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是默认的MySQL引擎。

InnoDB主要特性有:

  1. InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合.

  2. InnoDB是为处理大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的.

  3. InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统

  4. InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键

  5. InnoDB被用在众多需要高性能的大型数据库站点上.InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件

MyISAM存储引擎

MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务

MyISAM主要特性有:

  1. 大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持
  2. 当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成
  3. 每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
  4. 最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上
  5. BLOB和TEXT列可以被索引
  6. NULL被允许在索引的列中,这个值占每个键的0~1个字节
  7. 所有数字键值以高字节优先被存储以允许一个更高的索引压缩
  8. 每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快
  9. 可以把数据文件和索引文件放在不同目录
  10. 每个字符列可以有不同的字符集
  11. 有VARCHAR的表可以固定或动态记录长度
  12. VARCHAR和CHAR列可以多达64KB

使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:

  • frm文件存储表定义
  • 数据文件的扩展名为.MYD(MYData)
  • 索引文件的扩展名时.MYI(MYIndex)

MEMORY存储引擎

MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。

MEMORY主要特性有:

  1. MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度
  2. MEMORY存储引擎执行HASH和BTREE缩影
  3. 可以在一个MEMORY表中有非唯一键值
  4. MEMORY表使用一个固定的记录长度格式
  5. MEMORY不支持BLOB或TEXT列
  6. MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引
  7. MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)
  8. MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享
  9. 当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)

6.编程题

给出一个链表,每 N 个独立做翻转

案例输入:a->b->c->d->e->f->g 3

案例输出:c->b->a->f->e->d->g

第二轮

1.编程题

有一个广告板,可以同时展示2个不同的广告,现有4个广告素材,要求展示的频率是1:2:3:4,设计该展示算法

2.编程题

给定一组进程的起始结束时间,求同时在运行的最大进程数

start []int64

end []int64

1-10 5-15 16-20

3.编程题

有一个暗箱 里面有手感相同的黑白球,分别为M个白球 N个黑球。每次不放回的方式摸一个 摸到白球+1 摸到黑球-1。中途可以选择停止,问最大期望得分是多少

4.编程题

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3

1,1,5 → 1,5,1

1,4,3,2

第三轮

1.线程轮流打印1,2,3,4和a,b,c,d

/**
 * 线程轮流打印1,2,3,4和a,b,c,d
 */
public class MultiThreadTest {
    public static void main(String[] args) {
        Object o = new Object();
        new Thread(new NumberRunnable(o)).start();
        new Thread(new CharRunnable(o)).start();
    }
}

class NumberRunnable implements Runnable {
    private Object obj;//声明一个类的引用

    //通过构造器将共享资源传进来
    public NumberRunnable(Object obj) {
        this.obj = obj;
    }

    public void run() {
        synchronized (obj) {
            for (int i = 0; i < 4; i++) {
                System.out.println(i + 1);
                obj.notifyAll();
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class CharRunnable implements Runnable {
    private Object obj;//声明一个类的引用

    //通过构造器将共享资源传进来
    public CharRunnable(Object obj) {
        this.obj = obj;
    }

    public void run() {
        synchronized (obj) {
            for (int i = 0; i < 4; i++) {
                char ch = (char) ('a' + i);
                System.out.println(ch);
                obj.notifyAll();
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

2.垃圾回收机制

  • 什么是垃圾回收机制

与C/C++相比,Java不需要程序员直接控制垃圾回收,内存分配与回收都是JVM自动进行的,JVM不定时回收不在使用的对象的内存空间

  • 为什么要进行垃圾回收?

随着程序的运行内存中存在的实例对象、变量等信息占据的内存越来越多,如果不及时进行垃圾回收,必然会带来程序性能的下降,甚至会因为可用的内存不足造成一些不必要的系统异常。

  • 哪些垃圾需要回收

如果某个对象不在引用,那么它可以被回收

3.什么时候进行垃圾回收

  • 引用计数算法(JDK1.2之前)

每个对象添加一个引用计数器,每被引用一次,计数器加一,失去引用,计数器减一。

当计数器在一段时间保持0时,该对象可以被回收。

缺点:当两个对象A,B相互引用时,当两个对象相互引用的时候,当其他所有的引用都消失后,A和B还有一个相互引用,计数器各为1,而实际上两个对象已没有额外的相互引用,却不会被回收

  • 可达性分析算法

该算法从离散数学的图论中引入,程序把所有的引用关系看作一张图,从一个结点GC Root开始,寻找对应的引用结点,找到这个结点后,继续寻找这个结点的引用结点,当所有的引用结点寻找完毕后,剩余的结点被认为没有被引用的结点,即无用的结点。

  • 可以作为GC Root的对象
  1. 虚拟机栈中引用的对象(本地方法表)
  2. 方法区中静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中引用的对象(Native Object)
  • 引用的分类

    1. 强引用

      被New出来的对象所加的引用,它的特点就是永远不会被GC,除非被设置为NULL

    2. 软引用

      非必须的引用,内存溢出之前进行回收。如果JVM内存并不紧张,这类对象可以不被回收,如果内存紧张,则会被回收。此处有一个问题,既然被引用为软引用的对象可以回收,为什么不去回收呢?其实我们知道,Java中是存在缓存机制的,就拿字面量缓存来说,有些时候,缓存的对象就是当前可有可无的,只是留在内存中如果还有需要,则不需要重新分配内存即可使用,因此,这些对象即可被引用为软引用,方便使用,提高程序性能。

    3. 弱引用

      第二次垃圾回收时回收。弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。
      弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器。

    4. 虚引用

      垃圾回收时回收,无法通过引用取到对象值。虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。虚引用主要用于检测对象是否已经从内存中删除。

4.如何垃圾回收

  • 内存主要被分为三块,新生代、旧生代、持久代。三代的特点不同,导致所用的GC算法不同。
  • 新生代适合那些生命周期较短,频繁创建和销毁的对象
  • 旧生代适合生命周期较长的对象,用于存放经过多次垃圾回收仍然存活的对象,例如缓存对象
  • 持久代在Sun的JVM中就是方法区的意思,尽管有些JVM没有这一代,主要存放常量及类的一些信息

5.常见的GC算法

5.1标记清除算法

  • 效率问题:标记和清除两个过程的效率低
  • 空间问题:标记清除之后,会产生大量不连续的内存碎片,空间碎片会导致程序运行过程中需要分配较大对象时,无法找到足够的连续内存而触发另一次垃圾回收。

5.2复制算法

  • 将内存划分为两块,每次只使用其中一块
  • 当一块内存用完之后,将还存活的对象复制到另一块上,然后把已使用过的内存空间一次清理。
  • 反复交换两个内存的角色,完成垃圾收集

5.3标记整理算法

  • 在标记清除算法基础上做了优化,把存活的对象压缩到内存的一端,直接清理边界以外的内存,老年代使用的就是标记压缩法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WER7AsM1-1589884283199)(20181217150802215.png)]

5.4分区收集算法

  • 将内存分为N个独立的空间,每个小空间都可以独立使用,不是对整个空间进行垃圾回收,从而提升性能,减少GC的停顿时间

6.Java里有哪些Map

  • collection是单列集合,元素是孤立存在的。Map是双列集合,每个元素由键和值组成,通过键可以找到对应的值
  • HashMap:存储数据采用哈希表结构,元素的存取顺序不能保证一致
  • LinkedHashMap:HashMap的子类,存储结构采用哈希表+链表,通过链表可以保证元素存取顺序一致

7.HashMap的实现过程

  • HashMap底层基于数组+链表组成

  • 当哈希冲突严重时,在桶上形成的链表会变得越来月长,查询的时候效率就会越来越低,Java1.7的实现原理

  • Java1.8重点优化了查询效率问题

8.ConcurrentHashMap的实现

  • ConcurrentHashMap是Java中一个线程安全且高效的HashMap实现,解决高并发问题
  • ConcurrentHashMap是由Segment数组和HashEntry组成

9.HashMap、HashTable、ConcurrentHashMap三者的区别

  • hashMap:线程不安全,数组+链表+红黑树
  • HashTable:线程安全,锁住整个对象,数组+链表
  • ConcurrentHashMap线程安全,CAS+同步锁,数组+链表+红黑树
  • HashMap的key和value均可为null,其他两个不行

10.Thread与Runnable在线程管理上的区别

  • 如果一个类继承了Thread,则不适合资源共享。如果实现了Runnable接口,则容易实现资源共享
  • 实现Runnable接口比继承THread类具有的优势:
    • 适合多个相同的程序代码的线程去共享同一个资源
    • 可以避免Java中单继承的局限性
    • 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立
    • 线程池只能放入实现Runnable或Callable类线程,不能直接放入继承Thread的类
  • 在Java中,每次程序运行至少启动两个线程。一个是Main线程,一个是垃圾收集线程。

第n轮 ‘精力有限,稍后整理’

  • String为什么设计成Final不可变?

  • 自己能实现一个不可变的类吗?

  • equals 和 hashcode 为什么要一起重写?如果不重写hashcode会出现什么问题?

  • hashmap插入的时候,哈希冲突解决? 查找的时候,哈希冲突怎么解决?

  • hashset是怎么实现的? hashmap是怎么实现hashset的?

  • 多线程:并发和并行,原子类,CAS操作

  • CopyOnWriteArrayList的相关特性?

  • ArrayList遍历的时候能删除元素吗? 删除的时候会报什么异常?

  • 多态讲一下

  • 线程间通信

  • 自旋锁是什么,怎么实现的

  • volatile有什么用

  • 堆和栈的区别

  • 问我对多线程和JUC熟悉吗,我说了AQS、ReentrantLock、线程池、CountDownLatch、CyclicBarrier,然后问了我AQS是什么,介绍了AQS的一部分内容,和具体实现。

  • 问我对jvm的垃圾回收了解吗,说了从新生代到老年代的整体的过程,用什么垃圾回收算法,举了几个垃圾回收器的例子,说来空间分配担保和可能产生full gc的原因,反正尽可能细的去说自己知道的,越细越好。

  • 问了java线程池的具体参数,问了最长空闲等待时间的具体情况,释放线程的过程,什么时候什么情况释放,释放时队列的情况是怎么样的。然后给了一个具体的场景分配服务器和设置线程池参数。单次任务的cpu时间是100ms,要达到一秒钟1000次任务量,服务器是4核8g,问要多少服务器,每个服务器具体的线程池参数配置是多少。

  • 自旋锁的原理,什么时候用自旋锁,什么时候用互斥锁

  • 详细讲解项目中用到的线程池,线程数应该设置为多大

  • 重载和重写的区别

  • ThreadLocal的内部实现。怎么确定一个线程使用的是哪一个threadlocal?

  • 重写的实现

  • Integer和int的区别

  • 说一下面向对象

  • 垃圾回收机制

  • 讲讲乐观锁和悲观锁

操作系统

  • 操作系统相关,进程线程区别
  • 进程和线程的区别?内存管理说一下你的了解。进程调度算法。
  • 进程线程是什么,进程间的通信有哪些方法
  • 进程间通信有哪些
  • linux命令了解吗
  • 怎么查看端口号占用情况
  • linux中CPU调度怎么做的
  • 调度的基本单位是什么
  • 进程状态都有哪些,怎么转换
  • 调度算法都有什么,调度的时机是什么
  • fork时内存空间发生了哪些变化
  • copy on write做了什么(这个之前没学到,大佬给我讲了一遍)
  • 等待态可以收到信号么(没了解过,大佬讲了一下S、D状态)
  • 死锁(死锁条件、避免死锁、死锁检测、死锁预防)
  • 进程和线程的区别,进程通信方式
  • 死锁四个必要条件
  • 讲讲多进程和多线程
  • 进程间通信和线程间通信的区别
  • Linux 查看内存
  • 一个进程,有十个线程,其中一个线程fork后,子进程有几个线程
  • 进程调度
  • 线程和进程

计算机网络

  • OSI七层模型,socket在哪一层
  • 浏览器输入一个地址到看到返回内容中间发生了什么
  • 接着上个问题,DNS实现的机制
  • select poll epoll区别,什么时候用select和poll
  • udp适用于什么场景
  • tcp和udp可以绑定到同一个端口吗?如何实现
  • http协议,connection选项的作用
  • tcp断开连接的过程
  • http复用连接 如何区分请求?
  • epoll的触发方式 水平触发和边沿触发说一说
  • http是有状态还是无状态? TCP是有状态还是无状态?
  • 客户端禁用cookie怎么办? 你说的实现方式安全吗?
  • SSL,http和https,https是有状态还是无状态?
  • TCP状态转换图,画一下。
  • 操作系统I/O模型了解吗?epoll模型了解吗?
  • TCP了解多少
  • 那什么时候会收到RST报文段
  • 那说一说四次挥手
  • 服务器大量处于TIME_WAIT状态,可能的原因,造成什么影响,怎么解决(解决方案没答上来)
  • 那大量处于close_wait呢(答错了,理解成LAST_ACK状态了,但面试官也没说)
  • IO模型有哪些
  • 用的最多的应该算IO多路复用模型,讲讲它的优缺点
  • 阻塞IO 非阻塞IO说一下(说了5种IO模型,详细说了下io复用)
  • http长连接短连接说一下
  • 路由器是哪一层的,有什么功能,路由寻址怎么找的,路由表存了什么
  • ping协议会发生什么事情(当时以为问ICMP,结果下面引导到了dns)
  • dns协议,让后udp还是tcp
  • http response里面都有哪些内容(大概说了一部分)
  • 项目里用了IO复用,说一下select poll epoll(讲了区别,epoll底层数据结构,ET、LT)
  • dns是tcp还是udp
  • 说一下timewait和closewait(大佬讲了timewait中等待报文在网络中消失具体指的是路由器的缓存
  • 说一下拥塞控制
  • udp报文最大长度(说了MTU1500,但是之前在网上看到过实际会更小,后来看到Internet是576)
  • 问了一个页面重定向的问题,问我一个页面自动跳转另一个页面怎么实现,我说了前端和后端都可以做跳转,然后问我各自的具体是怎么做的,这部分我没答好,没了解过这部分,然后问了301和302的区别,我只知道都是重定向,也没答好,(一个是临时的一个是永久的,我连这个都没答出来)
  • 那聊聊HTTP吧,GET/POST,GET和POST有长度限制吗,301和302
  • HTTP2.0有什么新特性,HTTPS过程
  • 讲一下Cookie,Cookie能跨域吗
  • DNS
  • 详细讲解select和epoll的底层实现,LT和ET模式的底层区别,ET模式下的读写注意事项
  • 输入网址后的执行过程,详细讲解每一层
  • 详细讲解HTTPS的原理,客户端为什么信任第三方证书
  • 怎么实现DNS劫持
  • TCP和UDP的区别,TCP如何保证可靠性,UDP又有什么优势
  • tcp的重传机制了解什么
  • tcp的拥塞控制
  • 说一下cookie和session
  • 为什么TCP比较慢,另外怎么保证可靠性
  • http协议的理解
  • 三次握手四次挥手
  • TCP四次挥手
  • HTTP和TCP的关系
  • HTTP数据量很大,怎么发送
  • 讲讲滑动窗口
  • TCP server最多可以建立多少个TCP连接
  • TCP 流量控制和拥塞控制
  • Socket编程有了解过吗
  • TCP状态机
  • 四次挥手时,第一次挥手后,客户端和服务器的TCP分别处于什么状态
  • tcp三次握手四次挥手,为什么是四次。
  • http https的区别,https需要花钱买啥
  • 常见的状态码
  • tcp 和 udp 如果想让udp实现可靠连接怎么办
  • DNS
  • 状态码 特别问了502,504
  • 计算机网络了解吗?OSI七层模型?选择一个比较熟悉的层,介绍一下有哪些协议
  • 3次握手都发送了什么数据包
  • 在浏览器中输入url,回车发生了什么
  • DNS的运行过程,DNS性能优化有哪些方法
  • https协议加密具体过程
  • https和http区别,对称加密和非对称加密区别
  • http1.0和http1.1和http2.0
  • 13台根域名的服务器ip地址保存在哪里
  • DNS的分级查找
  • 手机与wifi是怎么建立连接的
  • 路由器是怎么传输数据的(记不清了,围绕着路由器问了很多)
  • 内网中两台电脑怎么建立连接
  • TCP三次握手
  • get和post区别
  • cookie和session
  • CDN了解么

数据库

  • SQL语句怎么执行的知道吗,底层原理是什么?

  • 你对数据库的事务是怎么理解的

  • 四种隔离级别知道吗?

  • 悲观锁和乐观锁呢?悲观和乐观锁的具体实现原理呢?

  • 索引的种类知道吗?组合索引的最左匹配原则?

  • 索引的底层原理呢?

  • MySQL索引的实现方式?为什么用B+树不用二叉树?

  • 如何优化一条sql的查询语句

  • msyql有哪些索引

  • 联合索引,最左匹配的原理

  • redis有哪些淘汰策略

  • mysql的索引有哪些,区别是什么,特点

  • 数据库隔离级别,innodb和myisam的区别。

  • innodb的隔离级别,我自己说了如何实现的

  • redis数据结构

  • mysql的索引:B+树底层实现?B树的底层实现?为什么要用B+树而不用B树?

  • 最左前缀匹配具体是怎么实现查找的?最左前缀匹配用了B+树的哪些特性?

  • (a,b,c)联合索引,为什么不能单用(b),而一定要用(a,b)?B+树是怎么实现的?

  • 什么是幻读,不可重复读?这些概念是在事务内还是事务外? 事务内

  • mysql怎么实现可重复读?设置了可重复读隔离级别底层是怎么实现的? (MVCC)

  • 了解MVCC吗?怎么实现的?什么是快照读?快照读能读取到最新的吗?快照读和当前读的区别?

  • synchronized和reentrentlock哪个效率高?

  • 为啥B+树最后叶子节点需要用链表相连接? 便于区间查找

  • 手写SQL,join

  • 说一下数据库索引,然后说一下索引的优缺点

  • redis都有哪些数据类型(本来以为会展开问数据类型底层实现)

  • 索引(讲的比一面更详细了一些)索引的使用条件 优化 最左原则

  • Redis的使用场景

  • 基于Redis实现的分布式锁,问的比较细,比如线程阻塞导致,导致锁过期,其他线程获取了锁然后前一个线程又释放了第二个线程的锁这种,还问了一个线程等待Redis的分布式锁,整体等待时间的是怎么样的

  • 说一下mysql的事务隔离级别,然后讲了四个隔离级别,以及对应产生的问题(脏读不可重复读幻读),以及InnoDB对应的2 3级别的实现,MVVC的实现,两个隔离级别产生Review的时间点和次数的区别,还有Next-Key Lock ,行锁加间隙锁。

  • 问了mysql的引擎,索引,有哪些索引,然后问了主键索引和非主键索引的区别,讲了聚集索引,然后问了索引访问的过程,问了用聚集索引和不用的磁盘io访问次数的不同。

  • 给了一个数据库表
    Student
    year | first_name | name

    1. 写SQL查询每年每个姓氏的学生人数
    2. 有100w数据,现在需要经常查询
    3. 某年某姓氏的学生列表
    4. 近三年某姓氏的学生列表
    5. 某姓氏的全部学生

    怎么建索引

  • 数据库第一范式,第二范式,第三范式

  • 数据库索引、事务

  • 数据库查询10-20行内容

  • 创建数据库查找135开头的电话

  • MYSQL的索引

  • MYSQL 为什么用B 树不用红黑树

数据结构与算法

  • 比如1234的下一个比他大的数是1243,再下一个是1324,如何给出下一个数找到比他大的数

  • 两个文件a和b,找出里面相同的url

  • 手写快排

  • 堆排,TOP K问题:小顶堆

  • 手写代码:单向链表,对折成1 ->n->2->n-1->3……

  • 海量IP,给定IP,输出IP出现的次数,分析时间复杂度和空间复杂度,答了字典树,哈希,位图

  • 二叉树,技术层从左向右,偶数层从右向左进行输出

  • 一个单链表,奇数位递增,偶数位递减,最终实现一个整体递增链表

  • 将二叉树用数组存储

  • 判断二叉树是否是镜像

  • 输入“aaaaabbbbccc”,输出“a5b4c3”

  • 实现一个缓存队列 ,二叉树的镜像

  • 树的节点最大距离

  • 二叉搜索树找到第k小的节点

  • 有一个日志文件,里面每一行都有ip、time、context等信息,怎么查询某个ip有多少个

  • 给定a=1,b=2,不给定其他变量,怎么交换它们俩的值

  • 给定一个数组,有若干个数,找到a+b+c=99,找到所有abc的组合

  • 基于比较的查找,最好的性能上logn,还有什么查找能突破这个限制

  • 排序算法里面最好的性能上nlogn,能突破这个限制吗

  • 根据前序遍历序列和中序遍历序列求出后续遍历序列

  • 反转链表,topk问题说思路、时间复杂度

  • 二叉树Z字打印

  • 一个从1开始的有序数组,找字典序第k大的数,说思路(leetcode440 没做过 提示了一下树,想出来了)

  • 手撕算法,LeetCode原题 23. Merge k Sorted Lists,有一点点不一样就是要求后面没满k个的也转置。

  • 讲一讲一致性哈希

  • 手撕算法,链表快排,用快排的思想实现对链表的数据结构的数据做快排。

  • 在中文页面解析、中文数据处理中,常常遇到用中文表示的数字,例如:五千三百万零五百零一。
    我们一般需要把它转化成int型整数,进行实际存储和使用。
    请完成一亿(不含)以内的中文数字到int整数的转换。
    int ParseInt(string input){
    }

  • 给了一个树结构,节点的定义里有parent字段,可以直接找到它的父节点。

    现在要寻找整个树中序遍历时,某一个节点的下一个节点是哪个,怎么找。

    面试官说你可以弄个纸画一画,我画了一会儿,然后说了一下思路,就过了。

  • 有序数组找到第一个小于0的数和第一个大于0的数

  • 矩阵左上角到右下角的最短路径和

  • 合并两个排序数组并去重

  • 最长无重复子串

  • 两个排序数组找中位数

  • 合并k个有序数组,写代码

  • 一个整数分解为多个不同的数之和,有几种分法,写代码

  • 求数组中第K大的值

  • 树的路径和

  • 写一个归并排序

  • 讲一下LRU算法原理

  • 在字符串中找出不重复字符的个数

  • 找出两个只出现一次的数字,其余的数字都出现了两次

  • 一个数组,除了某个数字只出现一次,其它都只出现两次,做法说了 HashMap 记录和异或操作,然后让我手写了异或的做法

    • 二叉树的子结构,应该是 leetcode 的题,判断树 B 是否是树 A 的子树,这个我就写了个递归
  • 给 N 个 32 位无符号整数,有重复,找出重复率最高的前 K 条

  • 两条链表交叉求交叉点

  • 算法题:生成全排列,非递归中序遍历二叉树

  • 把汉字表示的数字转化成阿拉伯数字

  • 树存数据库里有什么办法

  • 最小编辑距离

  • 查找二叉树最大深度

  • 二叉树遍历

  • 写代码判断IP地址

  • 如何计算完全二叉树的总节点数

  • 一个数组a,判断是否存在i

  • 找到一个字符串中不重复子串的最大长度

  • 一个二叉搜索树,找出小于m的最大数

  • 最小生成树

  • a,b是两个矩阵,判断a在b中出现了几次?a的大小小于b

  • 一维01数组中,求最长的区间,其中0和1数量相等

  • 两个栈模拟双端队列

  • 链表判环

  • 手写单例

  • 给定一颗二叉树,求其中root的最长路径。所谓路径是指,联通两个结点的最小边数

  • int 4字节整数的海量数据,如何给出一个数,判断是否在这堆数据里?

  • 平衡二叉树查找复杂度

  • 快速排序复杂度,实现,什么时候复杂度最大

  • 红黑树和平衡二叉树

  • 给n元钱,m个人,写个随机分钱的函数

  • 两个栈实现一个队列

  • 给个数组求连续子序列最大和

  • 滑动窗口的最大值

  • 找出一颗完全二叉树最后一个节点,时间复杂度要求 logN的平方

  • 设计模式

    • 那写一个单例模式吧,写一个好点的
  • SSM

    • Spring的特点、IOC和AOP
    • Spring上来问一个bean循环依赖怎么解决
  • 分布式

    • 分布式锁
    • 解释 分布式、微服务、负载均衡、高可用
    • Raft的选举过程,投票规则,日志复制过程
  • 系统设计

    • 假设现在给你几千万条数据,存在外存里,你如何找到最大的前100条,综合考虑时间和空间复杂度
    • 问了一个大数据判重的题,只有一台机器,数据是int范围,给了3个思路,一个是hash切分大文件为小文件,对小文件用hashset去做判重,还有用BitSet,单机大概500mb内存可以解决,最后一个是用布隆过滤器解决,内存利用更小。 然后问我布隆过滤器的误差怎么解决,我说可以加大hash数量或者hash的范围,还有可以用多个独立的不同的布隆过滤器来解决。
    • 12306买票
    • 大文本数据(数T),统计每个字符串的频率
  • 项目

    • 详细说一下你用的这用到的这几个技术,分别是怎么用的
    • 整个项目中你认为最有技术价值的点在哪
    • Spring的IOC和AOP知道吧,单实例无状态你怎么理解
    • 分页和排序这两个功能,在Hibernate打印出来的SQL语句里是怎么样的?
    • SQL语句怎么执行的知道吗,底层原理是什么?
    • 重点问了Netty,启动、连接建立、NIO特点、适用场景。

特殊题:

  1. 作者:EternityY
    链接:https://www.nowcoder.com/discuss/192224

    算法题:把一个包含n个正整数的序列划分成m个连续的子序列。设第i个序列的各数之和为S(i),求所有S(i)的最大值最小是多少?

    例子:

    序列1 2 3 2 5 4划分为3个子序列的最优方案为 1 2 3 | 2 5 | 4,其中S(1),S(2),S(3)分别为6,7,4,那么最大值为7;

    如果划分为 1 2 | 3 2 | 5 4,则最大值为9,不是最小

时间线很有参考价值:https://www.nowcoder.com/discuss/190665

mybatis实现原理、springmvc实现原理

  1. 给一张表:学号,姓名,成绩,学号唯一,成绩有重复。实现根据学号差成绩,根据成绩区间查学号
    问把这些信息读入内存,应该怎么存放。我说成绩用红黑树变种区间树,学号是B+树,
    然后面试管说成绩用区间树实现不好,我改成B+树,然后说了时间复杂度,过
    学号B+树是lgn,面试官说有没有更快,我说hash表
  2. AB抛硬币,A先抛硬币,正面为赢,直到其中一个人抛出正面, 求A赢的概率
  • 编程:一个有10万条记录的log文件,每行有三个字段,“域名,ip,time”,求文件中IP出现次数top10的ip
  • 代码题。找数组中第k大的数。使用堆做了,然后问时间复杂度。
  • 代码题。给出一个元素不重复的排序数组,问v如果插入数组中是第几大。一开始直接使用lower_bound实现,然后问lower_bound和upper_bound的区别,回答了lower_bound是查找第一个大于等于v的数的位置,upper_bound是查找第一个大于v的数的位置。接着问能不能自己实现二分,然后就写了个二分。
  • 数据库问题。需要以字段(B,A)和B进行查询,问怎样建立索引。回答了建立(B,A)索引。问这样查询B可以使用索引吗。回答可以,因为最左前缀原则。

你可能感兴趣的:(软件工程,牛客刷题机)