2021 春招

[TOC]

语言/语法

python底层的代码有了解吗,是怎么用C实现的

static 有什么用途?(请至少说明两种)

引用与指针有什么区别?

全局变量和局部变量在内存中是否有区别?如果有,是什么区别?

写出 float x 与“零值”比较的 if 语句

const float EPSINON = 0.00001; 
if ((x >= - EPSINON) && (x <= EPSINON)

不能做 switch()的参数类型是

自动装箱/拆箱

https://www.cnblogs.com/dolphin0520/p/3780005.html

hashCode() 与 equals()

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    User user = (User) o;
    return age == user.age &&
        Objects.equals(name, user.name) &&
        Objects.equals(passwd, user.passwd);
}

@Override
public int hashCode() {
    return Objects.hash(name, age, passwd);
}

作者:蓝色北半球
链接:https://www.nowcoder.com/discuss/598750?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网

Java内存模型、主内存和工作内存交互操作

https://blog.csdn.net/javazejian/article/details/72772461

截屏2021-02-24 下午1.48.52

截屏2021-02-24 下午1.49.48

voliatle怎么实现的、工作原理是什么、总线嗅探机制了解吗

synchronized的锁优化有哪些、讲一下锁状态和锁升级

https://blog.csdn.net/javazejian/article/details/72828483

什么情况下用ReentrantLock而不用synchronized

Java的中断怎么实现,为什么synchronized不能中断,ReentrantLock可以中断

ReentrantLock怎么实现的(AQS)

列举几种你知道的垃圾回收机制

CMS垃圾收集的原理

有什么方法来避免Full GC

  • 避免频繁创建销毁大对象(运用单例模式)
  • 把新生代空间调大

NIO和BIO

谈一下Java类加载机制

类加载

类加载的过程主要分为三个部分:

  • 加载
  • 链接
  • 初始化

而链接又可以细分为三个小部分:

  • 验证
  • 准备
  • 解析

截屏2021-02-26 下午5.04.05

https://darylliu.github.io/archives/1e480d2f.html

ConcurrentLinkedQueue、CopyOnWriteArrayList

数据库中读写分离的机制

进程间通信方式、Linux管道用什么来实现的

虚拟内存、分页内存管理、多级分页、局部性原理

CPU的寻址过程

浏览器输入www.baidu.com 到显示页面经历了什么过程

HTTPS的加解密过程(非对称密钥加密和对称密钥加密)

TCP的拥塞处理机制

MySQL索引与锁的关系(走索引锁粒度小,不走索引锁粒度大)

MySQL怎么实现分布式锁、数据库的唯一索引知道吗

缓存一致性问题

快排的时间复杂度是什么,最坏的时间复杂度什么情况下会发生、怎样避免

同步和异步的概念

Java虚拟机的基本机构?

什么是类加载器?

简单谈一下类加载的双亲委托机制?

普通Java类的类加载过程和Tomcat的类加载过程是否一样?区别在哪?

简单谈一下Java堆的垃圾回收机制?

数据结构

什么是平衡二叉树?

堆栈溢出一般是由什么原因导致的?

冒泡排序算法的时间复杂度是什么?

数据库

数据库笔记

数据库的锁

索引方面

为啥索引用b+树,比较其他数据结构,他的优点是啥

查询语句走不走索引

sql语句执行慢的可能原因

ACID

事务的隔离级别

  • 数据库中隔离级别的操作

    • 设置隔离级别:set tx_isolation = ‘READ-UNCOMMITTED’
    • 查看隔离级别:select @@tx_isolation
  • 事务的四个隔离级别

    • READ UNCOMMITTED (读未提交)

      • 一个事务可以查看到未提交的内容(脏读
      • 除非真的有非常必要的理由,一般很少使用
      • 对同一数据表开启A、B两个事务(A、B事务交叉) start transactionA事务只查询数据表中内容,B事务做增删改操作但不commit(提交),A事务依旧可以查询到表中的数据改变(查询到未提交的内容—脏读)
    • READ COMMITTED (读提交)

      • 大多数系统默认的隔离级别(但MYSQL不是)
      • 一个事务开始时,只能看到已经提交的事务所做的修改
      • 一个事务从开始知道提交之前,所做的修改对其他事物都是不可见的
      • 也叫不可重复读(两次执行同样的查询,可能得到不同的结果)
      • 对同一数据表开启A、B两个事务(A、B事务交叉) start transaction A事务只查询数据表中内容,B事务做增删改操作但不commit(提交) A事务查询不到表中的数据改变的内容 B事务提交 A查到的数据改变(A两次查询,产生不同的结果 不可重复读)
    • REPEATABLE READ (可重复读)

      • MYSQL的默认事务隔离级别
      • 解决了脏读问题
      • 保证同一个事物中多次读取同样的记录的结果是一致的
      • 无法解决幻读(Phantom Read)问题 (某个事务在读取某个范围内的记录时,另一个事务又在该范围内插入一个新的记录,当之前的事务再次读取该范围的记录时,会产生幻行)
      • InnoDB和XtraDB通过多版本并发控制(MVCC Multiversion Concurrency Control) 解决了幻读问题
    • SERIALIZABLE (可串行化)

      • 最高隔离级别
      • 通过强制事务串行执行,避免了幻读问题
      • 给事务加上共享锁,同时只能有一个事务操作,解决幻读问题
      • 会导致大量超时和锁竞争问题
      • 开启B事务时无法增删该操作
      • 只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑使用该级别

    | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁 |
    | ———————— | —— | ————— | ————— | —— |
    | READ UNCOMMITTED | YES | YES | YES | NO |
    | READ COMMITTED | NO | YES | YES | NO |
    | REPEATABLE READ | NO | NO | YES (MVCC) | NO |
    | SERIALIZABLE | NO | NO | NO | YES |

网络

tcp time_wait和close_wait区别以及产生原因,过多的话处理方法?

https概念

HTTP 和 HTTPS 的主要区别?

三次握手,四次挥手

Internet 采用哪种网络协议?该协议的主要层次结构?

Internet 物理地址和 IP 地址转换采用什么协议?

IP 地址的编码分为哪俩部分?

操作系统

进程&线程概念与区别

任务调度算法及简单介绍

正向代理和反向代理

描述实时系统的基本特性

A,B,C,D 四个进程,A 向 buf 里面写数据,B,C,D 向 buf 里面读数据,当 A 写完,且 B,C, D 都读一次后,A 才能再写。用 P,V 操作实现。

假如 A 账户给 B 账户转钱,会发生死锁吗?能具体说说吗?

https://blog.csdn.net/taylorchan2016/article/details/51039362

高并发

设计模式

单例模式

public class Singleton{
    // volatile 关键字确保 当uniqueInstance 变量被初始化成 Singleon实例时
    // 多个线程正确地处理uniqueInstance变量
    private volatile static Singleton uniqueInstance;
    private Singleton();
    public static Singleton getInstance(){
        // 检查实例,如果不存在,则进入同步区块,如果存在,直接返回
        if(uniqueInstance == null){// 只有第一次才会彻底执行这里的代码块
            sychronized(Singleton.class){
                if(uniqueInstance == null){//进入区块后,再检查一次,如果仍是null,才创建实例
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }

}
// 这个做法会大大减少getInstance 的时间耗费

另外,需要注意 uniqueInstance 采用 volatile 关键字修饰也是很有必要。

uniqueInstance 采用 volatile 关键字修饰也是很有必要的, uniqueInstance = new Singleton(); 这段代码其实是分为三步执行:

  1. uniqueInstance 分配内存空间
  2. 初始化 uniqueInstance
  3. uniqueInstance 指向分配的内存地址

但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1->3->2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。

使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行

框架

Spring 的事务机制,你能说下 Spring 的事务传播吗?

分布式事务解决方案?

我: 我叭叭的照着资料查到的解决方案说了一通,面试官怎么好像没大听懂???

阿里巴巴之前开源了一个分布式 Fescar(一种易于使用,高性能,基于 Java 的开源分布式事务解决方案),后来,Ant Financial 加入 Fescar,使其成为一个更加中立和开放的分布式交易社区,Fescar 重命名为 Seata。Github 地址:https://github.com/seata/seata

Redis

redis基本数据结构

大数据

OLAP&OLTP

  • OLAP(On-Line Analytical Processing)联机分析处理,也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作快速响应的方式之一。应用在数据仓库,使用对象是决策者 OLAP系统强调的是数据分析,响应速度要求没那么高。

  • OLTP(On-Line Transaction Processing)联机事务处理,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。它具有FASMI(Fast Analysis of Shared Multidimensional Information),即共享多维信息的快速分析的特征。主要应用是传统关系型数据库。OLTP系统强调的是内存效率,实时性比较高。

什么场景下用的Spark ?解决了什么问题?

Spark 执行机制了解吗?

Spark 内存模型了解吗?

spark运行流程:

img

1、构建Spark Application的运行环境,启动SparkContext

2、SparkContext向资源管理器(可以是Standalone,Mesos,Yarn)申请运行Executor资源,并启动StandaloneExecutorbackend。

3、Executor向SparkContext申请Task。

4、SparkContext将应用程序分发给Executor。

5、SparkContext构建成DAG图,将DAG图分解成Stage、将Taskset发送给Task Scheduler,最后由Task Scheduler将Task发送给Executor运行。

6、Task在Executor上运行,运行完释放所有资源。

爬虫

反爬机制

  • 检查User-Agent是一种最简单的反爬虫机制
  • 访问频率限制(白天40,晚上60)
  • 蜜罐技术

解决办法

  • 而通过设定Request Headers中的User-Agent
  • 随机sleep
  • 使用Selenium来访问
  • 代理IP或者分布式爬虫:

系统设计

结合实际项目经验回顾软件工程的知识,

  • 如何从需求推导出系统设计,
    • 需求分析
    • 用例图:找出参与者,寻找用例,细化用例。—> 用例描述
    • 状态转换图
    • 时序图
    • 数据流图
  • 如何衡量两个不同设计的优劣:
    • 质量:安全性,可靠性,可维护性(可修改,可扩展),可移植性
  • 如何在各种限制下(人员、时间、资源等)选择其中更合适的设计,以及提升该设计的可拓展性等。
    • 更合适的设计:
    • 提升可扩展性:
    • 为了方便维护,把代码可读性放在第一位

项目

项目相关的优化方案

算法

  • 在白板上练习算法题目,写出清晰、简洁、bug free的代码, 并衡量时间和空间复杂度以及可能存在的副作用。
  • 尝试用不同的方法,思路或数据结构去解决同一个问题,并且衡量不同解法之间的优劣

用户输入 M,N 值,从 1 至 N 开始顺序循环数数,每数到 M 输出该数值,直至全部输 出。写出 C 程序。

int A[nSize],其中隐藏着若干 0,其余非 0 整数,写一个函数 int Func(int* A, int nSize), 使 A 把 0 移至后面,非 0 整数移至数组前面并保持有序,返回值为原数据中第一个元素为 0 的下标。

写一个程序, 要求功能:求出用 1,2,5 这三个数不同个数组合的和为 100 的组合个数

https://www.cnblogs.com/qi09/archive/2011/05/25/2057238.html

实现一个函数,把一个字符串中的字符从小写转为大写

随机输入一个数,判断它是不是对称数(回文数)(如 3,121,12321,45254)。不能 用字符串库函数

求 2~2000 的所有素数.有足够的内存,要求尽量快

埃氏筛法

首先,列出从2开始的所有自然数,构造一个序列:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …

取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:

3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …

取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:

5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …

取新序列的第一个数5,然后用5把序列的5的倍数筛掉:

7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …

不断筛下去,就可以得到所有的素数。

用Python来实现这个算法,可以先构造一个从3开始的奇数序列:

def _odd_iter():
    n = 1
    while True:
        n = n + 2yield n

注意这是一个生成器,并且是一个无限序列。

然后定义一个筛选函数:

def _not_divisible(n):
  return lambda x: x % n > 0

最后,定义一个生成器,不断返回下一个素数:

def primes():
  yield 2
  it = _odd_iter() # 初始序列
  while True:
    n = next(it) # 返回序列的第一个数
    yield n
    it = filter(_not_divisible(n), it) # 构造新序列

由于primes()也是一个无限序列,所以调用时需要设置一个退出循环的条件:

# 打印1000以内的素数:for n in primes():
    if n < 1000:
        print(n)
    else:
        break

将单向链表 reverse,如 ABCD 变成 DCBA,只能搜索链表一次。

将二叉树的两个孩子换位置,即左变右,右变左。不能用递规。

LeetCOde

  • [ ] 删除倒数第k个节点并返回头指针
  • [x] leetcode接雨水
  • [ ] 搜字节跳动笔试,扑克移动就能搜到了
    • [ ] 100只老虎,一只羊,羊最后会不会被吃的问题
  • [x] 手撕代码:类似leetcode 112及其延伸
    • [x] 手撕代码:类似leetcode 56及其延伸
  • [x] 手撕代码:leetcode151原题 并且只能用O(1) extra space
    • [ ] 思考题,64匹马,8个赛道,最少比多少场可以找出最快的4匹马?首先说15,后来想到了13,最后在网上搜的答案是11,挺有意思的一道题
  • [x] LeetCode 001. Two Sum
    • [x] LeetCode 015. 3Sum (可能会问 LeetCode 18. 4Sum 思路)
  • [x] LeetCode 020. Valid Parentheses
    • [x] LeetCode 021. Merge Two Sorted Lists
  • [x] LeetCode 025. Reverse Nodes in k-Group
    • [x] LeetCode 053. Maximum Subarray
  • [x] LeetCode 066. Plus One(等价于:高精度加法)
    • [x] LeetCode 098. Validate Binary Search Tree
  • [x] LeetCode 110. Balanced Binary Tree
    • [x] LeetCode 134. Gas Station
  • [x] LeetCode 136. Single Number
    • [ ] LeetCode 137. Single Number II
    • [x] LeetCode 146. LRU Cache(变形题:带有过期时间的 LRU 缓存)
    • [x] LeetCode 206. Reverse Linked List
  • [x] LeetCode207. Course Schedule. 拓扑排序,要求建图、排序代码,输出排序结果
    • [x] LeetCode 215. Kth Largest Element in an Array(等价于:快速排序)
  • [ ] LeetCode 232. Implement Queue using Stacks
    • [x] LeetCode295. Find Median from Data Stream.
  • [ ] LeetCode 328. Odd Even Linked List
    • [ ] LeetCode 415. Add Strings(等价于:大数加法)
  • [ ] LeetCode 440. 字典序的第k小数字
    • [ ] LeetCode 470:rand7() rand10()
  • [ ] LeetCode 496. Next Greater Element I(时间复杂度O(n))
    • [ ] LeetCode 716. Max Stack(两个栈实现最大栈,要求 pop,push,get_max 都为O(1))
  • [ ] LeetCode 860. Lemonade Change
    • [ ] LeetCode 862. Shortest Subarray with Sum at Least K
  • [ ] LeetCode 876. Middle of the Linked List
    • [ ] LeetCode 946. Validate Stack Sequences
  • [ ] LeetCode1209.Remove All Adjacent Duplicates in String II
    • [ ] 73 矩阵置零

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

「面试」七牛 上一篇
爬取B站弹幕并分析 下一篇