查看原文
其他

实习面,被问麻了

编程导航-打老虎 编程导航 2024-01-21

无论是通过与有经验的人交流,还是通过参考成功者的面试经历,参考他人的面试经验可以帮助我们更好地去走面试之路,并帮助我们更好地应对面试中的各种挑战。

编程导航星球中,一位鱼友在星球中分享了自己在一家风控行业独角兽的后端面试经验,今天分享给大家,希望能对大家有所帮助。

以下是星球原文内容。

星球原文链接:https://t.zsxq.com/0eQriamKl
本文已获得今晚打老虎授权

面试时间一小时

面试心得:一些行业领头独角兽的用人标准也比较刁钻,要求也挺严格,但暑期实习基本上都会基于开发的基础水平,以下为收录的部分问题,凭记忆写的,也凭个人水平总结整理的答案。

供同学们一起交流,如有不对烦请不吝赐教。

Redis的几种数据结构

  1. Redis支持多种数据结构,包括:
  2. 字符串(String):字符串是最基本的数据结构,可以用来存储字符串、整数或者浮点数。Redis中字符串的最大长度为512MB。
  3. 哈希(Hash):哈希是一种键值对形式的数据结构,适用于存储一些属性或者对象。每个哈希可以存储多个键值对。
  4. 列表(List):列表是一种有序集合,可以存储多个元素。Redis中的列表是双向链表实现的,可以对列表进行顺序和逆序的遍历操作。
  5. 集合(Set):集合是一种无序集合,可以存储多个元素。Redis中的集合是基于哈希表实现的,因此添加、删除、查找元素的时间复杂度都为O(1)。
  6. 有序集合(Sorted Set):有序集合是一种有序的、不重复的集合,每个元素都可以关联一个分值(score),根据分值来排序。Redis中的有序集合也是基于哈希表实现的,因此添加、删除、查找元素的时间复杂度都为O(1)。
  7. 除了上述基本数据结构之外,Redis还提供了一些高级数据结构,包括:
  8. 布隆过滤器(Bloom Filter):一种概率性数据结构,用于快速判断一个元素是否属于某个集合。
  9. 发布/订阅(Pub/Sub):一种消息通信模式,可以让多个客户端同时订阅某个主题(topic),并接收订阅者发布的消息。
  10. 位图(BitMap):一种长为N位的01序列,其中每个位只能为0或1。可以用来进行各种数据统计、过滤等操作。
  11. 地理位置(Geo):一种支持地理位置数据类型,可以进行地理位置距离计算、周边搜索等操作。
  12. 总之,根据不同的场景和需求,Redis提供了多种数据结构来满足不同的存储和操作需求。

在linux中网络端口占用情况

  1. 查看特定端口占用情况,可以使用:

sudo lsof -i :端口号

  1. 查看网络端口占用情况命令:

netstat -tln 查看所有TCP端口占用情况

lsof -iTCP -sTCP:LISTEN lsof命令可以列出当前系统中打开的所有文件和进程,包括网络连接和口

linux中的文本编辑指令

  1. Vi/Vim

  2. i: 插入模式

  3. ESC: 退出,回到命令模式

  4. :wq 保存

  5. :set nu 显示行号

  6. :set nonu 隐藏行号

  7. :10 跳到第十行位置

  8. :5j / :5k 相对跳转:j: 跳转到下面5行,k: 跳转到下面5行

  9. /example 搜索指定内容,按下回车会快速跳到第一个匹配的位置

  10. Nano

  11. Ctrl + O: 保存

  12. Ctrl + X: 退出Nano

  13. Ctrl + K: 剪切当前行

  14. Ctrl + U: 粘贴剪切的行

进程与线程的概念、区别、通信方式

  1. 进程与线程的概念
  2. 进程就是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发
  3. 线程就是进程里的子任务,实现进程内部的并发
  4. 进程与线程的区别
  5. 一个线程只能属于一个进程,而一个进程能够拥有多个线程,但至少有一个线程,线程依赖于进程而存在
  6. 进程在运行过程中会有独立内存单元,而多个线程共享进程的内存
  7. 进程是系统分配资源的最小单位,而线程是CPU调度的最小单位
  8. 进程切换的系统开销远大于线程切换的系统开销
  9. 进程间不会互相影响,一个线程挂掉会导致整个进程挂掉
  10. 进程间通信方式
  11. 管道、系统IPC(消息队列、信号量、信号、共享内容)、套接字socket

操作系统的内存管理方式

  1. 分段式
  2. 分页式
  3. 段页式
  4. 用分段方法来分配和管理虚拟存储器,程序的地址空间按照逻辑单位分成基本独立的段,每一段有自己的段名,再把每一段分成固定大小的若干页。
  5. 用分页方法来分配和管理实际内存,把整个主存分成与上述页大小相等的存储块,可装入作业的任何一页。程序对内存的调入或调出是按页进行的,但它又可按段实现共享和保护。
  6. 逻辑地址结构:一个逻辑地址结构用三个参数表示,段号S,页号P,页内地址d。

算法:检测单向链表是否形成环

public boolean hasCycle(ListNode head) {

if (head == null || head.next == null) return false;

}

ListNode slow = head;

ListNode fast = head.next;

while (slow != fast) {

if (fast == null || fast.next == null) {

return false;

}

slow = slow.next;

fast = fast.next.next;

}

return true;

}

import java.util.HashSet;

public class LinkedListCycle {

public boolean hasCycle(ListNode head) {

HashSet set = new HashSet<>();

while (head != null) {

if (set.contains(head)) {

return true;

}

set.add(head);

head = head.next;

}

return false;

}

}

算法:检验回文字符串

public static boolean isPalindrome(String str) {

int i = 0, j = str.length() - 1;

while (i < j) {

if (str.charAt(i) != str.charAt(j)) {

return false;

}

i++;

j--;

}

return true;

}

字符串匹配算法:KMP

可以直接看这个博客——阮一峰

https://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

TCP怎么保证传输的可靠性

  1. 检验和
  2. 通过检验和的方式,接收端可以检测出数据是否有差错和异常,有差错就会直接丢弃TCP段,重新发送。
  3. TCP在检验和时会在首部添加一个12字节的伪首部。
  4. 检验和总攻计算3部分:TCP首部、TCP数据、TCP伪首部。
  5. 序列号 / 确认应答
  6. 类似于问答,只要发送端有一个包传输,接收端没有回应确认包(ACK包),都会重新发送。或者接收端的应答包,发送端没有收到也会重发数据。
  7. 超时重传
  8. 就是发送出去的数据包到接收到确认包之间的时间如果超过了这个时间就会被认为是包丢失了,就要重新传。
  9. 这里讲两个概念:
  10. 往返时间:发送包到接收端的时间加上接收端回发确认包的时间
  11. 抖动:由于网络原因时间会有偏差,称为抖动
  12. 超时重传的时间大概是比往返时间+抖动时间还要稍微大一点的时间。
  13. 但是重发过程中,假如一个包经过多次重发也没有收到对端的确认包,那么就会认为接收端异常,强制关闭连接,并且通知应用通信异常强行终止。
  14. 最大消息长度
  15. 建立TCP连接时双方会约定一个最大的长度作为发送的单位,重传也是基于这个单位来重传。理想情况下该长度的数据刚好不会被网络层分块。
  16. 个人问题延伸:
  17. 如果数据的长度稍为过长被网络层分块会有什么后果?
  18. 如果数据的长度稍微过长被网络层分块,会导致TCP协议需要将数据分成多个小块进行传输,这样会增加网络传输的延迟和网络负载,因为每个小块都需要独传输和确认。此外,如果其中一个小块丢失或损坏,TCP协议需要重传整个数据块,而不是只重传丢失或损坏的小块,这也会增加网络传输的延迟和网络负载。
  19. 网络层为什么会分块?
  20. 网络层会将数据分块是因为网络层的传输单位是数据包,而数据包的大小是有限制的。如果数据的长度超过了数据包的大小,网络层就会将数据分成多个小块进行传输。这样做是为了保证网络传输的效率和可靠性,因为较小的数据包更容易被传输和确认,而且如果其中一个小块丢失或损坏,只需要重传这个小块,而不是整个块。
  21. 滑动窗口控制
  22. 由于超时重传效率低下,可以通过滑动窗口控制来做到不用等待确认包就可以发送下一个数据包,窗口的大小就是在无需等待确认包的情况下,发送端还能发送的最大数据量,这个机制的视线就是使用了大量的缓冲区,通过对多个段进行确认应答的功能,通过下一次的确认包可以判断接收端是否已经接收到了数据,如果已经接收到了就从缓冲区里删除数据。
  23. 在窗口之外的数据就是还未发送的和对端已经接收到的数据,接收端会在没有收到期望序列号数据之前会对之前的数据进行重复确认,发送端在收到某个应答包后又连续收到同样的应答包,那么数据此时就是丢失了,需要重传。
  24. 拥塞控制
  25. 如果网络拥堵,此时再发送数据就会加重网络负担,那么发送的数据段就很可能超过了最大生存时间也没有打到接收发,就会产生丢包问题。因此TCP引入了慢启动机制,先发送少量数据探探路,摸清网络拥堵状况后再决定按照多大速度传数据。

HTTPS的工作原理

  1. 对称加密和非对称加密
  2. 对称加密:
  3. 客户端和服务端共用一个密钥,该密钥可以加密一段内容,同时也可用于解密这段内容。
  4. 优点:加解密效率高,但是在安全性方面可能存在一些问题,因为密钥存放在客户端又被窃取的风险。
  5. 非对称加密:
  6. 有公钥和私钥。公钥通常存放在客户端,私钥通常存放在服务器。使用公钥加密的数据只有用私钥才能解密,反过来使用私钥加密的数据也只有公钥才能解密。
  7. 优点:安全性更高,因为客户端发送给服务器的加密信息只有用服务器的私钥才能解密,因此不用担心被别人破解,但缺点是加解密效率会稍微差点。
  8. HTTPS工作流程
  9. HTTP传输数据是明文的,因此很容易出现数据被监听和窃取以及篡改。
  10. HTTPS运用了非对称加密和对称加密结合的方式。
  11. 工作流程:客户端先生成一个密钥然后利用公钥加密传输给服务端,服务端利用私钥进行解密,然后利用该密钥与客户端通信。

数据库的锁有哪些?

  1. 数据库的锁分为
  2. 行锁
  3. 表锁
  4. 页锁
  5. 间隙锁
  6. 共享锁
  7. 排他锁

什么时候会用到行级锁?

  1. 例如:
  2. 一般在多个事务同时操作同一张表中的不同行时,用来控制并发修改,保证事务的原子性和隔离性。

MYSQL什么情况下可以添加行锁?

  1. 以下几种情况
  2. UPDATE、SELECT、DELETE、ADD

MYSQL的SQL会经过哪些步骤给到SQL服务器

  1. 经过以下步骤:
  2. 连接器→查询缓存→分析器→优化器→执行器

https://developer.aliyun.com/article/969887这篇博客也很给力力

Innodb的索引是什么结构?

  1. 两种吧可以回答
  2. 主要使用B+树数据结构,某些情况下可以使用哈希索引作为辅助索引

联合索引是什么?

  1. 简短回答
  2. 联合索引(Multi-column index 或 Composite index)是一种包含多个列的数据库索引,它可以提高查询的效率。与单列索引不同,联合索引可以在多个列上进行排序,这使得查询可以更快地定位到所需的数据。当查询涉及到多个列时,使用联合索引可以避免数据库进行全表扫描,从而提高查询效率。

事务的隔离级别

  1. 四种隔离级别
  2. 读未提交(Read Uncommitted):最低的隔离级别,它允许事务读取未提交的数据,可能会导致“脏读”(dirty reads)、“不可重复读”(non-repeatable reads)或“幻读”(phantom reads)问题。
  3. 读提交(Read Committed):允许一个事务只能看见已经提交的事务所做的修改,而未提交的事务所做修改任何人都看不见,可以防止“脏读”问题。
  4. 可重复读(Repeatable Read):事务开始时,每个查询看到的都是该事务启动时数据库中的一致性状态,保证了“可重复读”问题不会出现,但是有可能会出现“幻读”问题。
  5. 串行化(Serializable):隔离级别最高,强制事务串行执行,避免了“脏读”、“不可重复读”和“幻读”问题。

幻读是什么?

  1. 幻读定义
  2. 幻读是指在一个事务中,由于其他事务插入或删除了一些记录,导致当前事务两次查询同一范围的记录时,返回的记录数不同的现象。这是因为在读取数据时,当前事务读取到的数据与其他事务的操作发生了冲突,导致数据不一致。幻读通常发生在读取范围内的数据时,比如使用SELECT ... WHERE语句查询一段范围内的数据。为了避免幻读,可以使用数据库的锁机制或者使用更高的隔离级别。

Redis的网络模型

  1. 讲几个重点:
  2. 基于事件驱动模式
  3. 采用I/O多路复用实现同时处理多个客户端请求
  4. 执行请求时,将请求放入一个队列中等待处理,然后将相应文件描述符注册到事件处理器,然后等待事件。
  5. 单线程模型,所以在处理客户端请求时不需要进行线程上下文切换,避免了多线程并发下的锁竞争等问题,同时也减少了内存分配、上下文切换、线程同步等开销,从而获得更高的性能。

代码:手写一个单例模式

星球活动

1.点击领取星球精选高频前后端面试题汇总(https://t.zsxq.com/0d7Nw7YGw),搞定高频面试题,斩杀面试官!

2.欢迎已加入星球的同学 免费申请一年编程导航网站会员 !

3.欢迎学习 鱼皮最新原创项目教程,手把手教你做出项目、写出高分简历!

加入我们

欢迎加入鱼皮的编程导航知识星球,鱼皮会 1 对 1 回答您的问题、直播带你做出项目、为你定制学习计划和求职指导,还能获取海量编程学习资源,和上万名学编程的同学共享知识、交流进步。

💎 加入星球后,您可以:

1)添加鱼皮本人微信,向他 1 对 1 提问,帮您解决问题、告别迷茫!点击了解详情

2)获取海量编程知识和资源,包括:4000+ 鱼皮的编程答疑和求职指导、原创编程学习路线、几十万字的编程学习知识库、几十 T 编程学习资源、700+ 精华帖等!点击了解详情

3)找鱼皮咨询求职建议和优化简历,次数不限!点击了解详情

4)鱼皮直播从 0 到 1 带大家做出项目,已有 50+ 直播、完结 4 套项目、10+ 项目分享,帮您掌握独立开发项目的能力、丰富简历!点击了解详情

外面一套项目课就上千元了,而星球内所有项目都有指导答疑,轻松解决问题

星球提供的所有服务,都是为了帮您更好地学编程、找到理想的工作。诚挚地欢迎您的加入,这可能是最好的学习机会,也是最值得的一笔投资!

长按扫码领优惠券加入体验(三天内不满意可全额退款),也可直接在公众号后台回复客服,添加客服了解更多星球信息:

往期推荐

编程导航,火了!

学着学着,没了激情......

大学两年,醒悟了...

花了一年半,跨考上岸了!

双非本科,面试被拷打!

找实习,上岸拼多多!



继续滑动看下一个

实习面,被问麻了

编程导航-打老虎 编程导航
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存