面试复盘|赛宁网安中后台研发22届校招一二hr面面经
面试复盘|赛宁网安中后台研发22届校招一面二面hr面经
面试总体感觉不错。一开始约线下面,但是由于疫情,学校封校无法出去,短信沟通改线上面,次日就约了线上面,而且面试反馈很快。
一面面经
方式:腾讯会议
时间:9月28日15:20
时长:40分钟
Q:首先自我介绍
技术面开始:
Q1:刚刚你说计算机基础你都学过,那什么是线程调度?
A:当时傻了,就说了什么是线程、什么是进程。系统调度、调度算法讲讲。下面是从网上搜索整理的一个答案供参考。
在只有一个CPU的情况下,在任意时刻只能执行一条机器指令,每个线程只有获得CPU的使用权才能执行指令。所谓多线程的并发运行,其实是指从宏观上看,各个线程轮流获得CPU的使用权,分别执行各自的任务。线程调度是指按照特定机制为多个线程分配CPU的使用权。 线程调度有两种: 1.分时调度 分时调度就是所有线程轮流拥有(使用)cpu的使用权,平均分配每个线程占用cpu的时间 2.抢占式调度 抢占式调度就是优先让优先级高的线程使用cpu,如果线程的优先级相同,则会随机选择一个,所以谁的优先级高,谁抢夺cpu的几率就越大,从而优先级高的占用cpu的时间会更长,Java为抢占式调度.
Q2:知道死锁吗?
A:知道。各个进程相互等待对方手里的资源,导致各进程阻塞,无法向前推进的现象。
Q:那如何解决死锁问题?
A:首先死锁产生有四个条件:互斥条件、请求和保持条件、不可剥夺条件、循环等待条件,只要破环这四个条件中的任意一个或多个就不会发生死锁。比如资源一次性分配,这样就破环了请求和保持条件,但是这样会严重造成资源浪费。
产生死锁的四个条件: 互斥:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。 请求和保持:当进程因请求资源而阻塞时,对已获得的资源保持不放。 不可剥夺:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。 循环等待:在发生死锁时,必然存在一个进程--资源的环形链。
Q3:数据结构与算法也学过是吧,说说常见的排序算法?
A:知道的O(n^2)的有冒泡排序、选择排序、插入排序,还有一些O(nlogn)的:快速排序、堆排序、归并排序。其他的想不起来了。
Q:最快的排序算法的时间复杂度是多少?
A:现在能想起来的是O(nlogn)。
Q:有没有更快的?
A:可能有吧,不过现在知道的就是O(nlogn)。
面试结束网上查了下,还有更快的。见下图:
Q4:什么是网段?
A:这个大概知道是什么,但是具体概念不清楚。然后就胡说一通。下面网络搜到的:
网管:一种是指物理上由网络连接设备所相隔的网络。比如由路由设备(或者交换机,甚至集线器)连接的两个局域网,我们可以称之为两个网段。另一种是指从逻辑上,根据其IP地址中的网络地址来区分其所属的网段。
Q5:什么是公网和私网?
A:公网,也叫做外网,没有限制,只要能上网的用户,都可以访问,比如类似百度,新浪这样的网站。私网,只有属于局域网内部的成员,才可以访问。
Q6:私网是如何访问百度的?
A:知道有个NAT技术。
Q:除了这些计算机基础,还学过其他的吗?
A:其他的就是Java相关的了……还有数据库技术,MySQL和Redis。
Q7:那说说数据库的索引是什么吧?
A:之前总结过,直接看👇
索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。而且索引是一个文件,它是要占据物理空间的。
Q:什么情况下使用索引?
A:查多写少的情况下,适合使用索引。因为索引可以大大加快数据的检索速度,但是另一方面,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率。
Q:查找数据的时间复杂度是多少?
A:(这题不会,当时就瞎说了)额……根据索引查找数据,主要取决于树的高度,因为索引使用B+树,而三层B+树大概可以存储10亿数量级数据,所以时间复杂度是常数级别的
Q:不是这么算的,你稍后可以查一下。
A:嗯嗯,好。
Q8:还会Redis是吧,Redis是单线程的还是多线程的?
A:单线程。
Q:既然是单线程,那为什么执行快?
A:因为单线程,没有上下文切换的开销,另外Redis是基于内存的,与底层使用的数据结构也有关。(下面给一个标准的答案)
Redis为什么快: 1. 基于内存:Redis是使用内存存储,没有磁盘IO上的开销。数据存在内存中,读写速度快。 2. 单线程实现( Redis 6.0以前):Redis使用单个线程处理请求,避免了多个线程之间线程切换和锁资源争用的开销。 3. IO多路复用模型:Redis 采用 IO 多路复用技术。Redis 使用单线程来轮询描述符,将数据库的操作都转换成了事件,不在网络I/O上浪费过多的时间。 4. 高效的数据结构:Redis 每种数据类型底层都做了优化,目的就是为了追求更快的速度
Q9:Redis有哪些问题?
A:问题?是缓存雪崩、缓存击穿、缓存穿透吗?
Q:不是,这是和数据库使用中的问题,我想问的是Redis本身的问题。
A:这不清楚。
Q10:如何查看Redis中有多少数据?
A:不记得了,有一个keys命令,不知道有没有可以返回数据多少的。
Q:那如何查看以某个字符为前缀的数据?
A:使用keys xx*命令。
Q:有其他的办法吗?
A:不知道了。
Q:以后千万不要使用keys *这个命令。
A:(……)哦。因为redis是单线程的,如果数据量非常大,会发生阻塞吗?之前都是学习,没在生产中用过。
反问阶段:
Q:公司主要业务,部门技术栈
Q:什么时候知道面试结果(很快,十一假期前吧)。
二面面经
方式:腾讯会议
时间:9月29日15:00
时长:20分钟,没问啥,就是先聊聊,然后讨论笔试题。
感觉这个面试官不是写代码的(分不清Java和C/C++)
自我介绍、实习和项目
笔试题讨论:
第一题:有n盏灯,编号为1~n。1号将灯全部打开,2将按下所有为2的倍数的开关,(这些灯将被关掉)第3个人按下所有编号为3的倍数的开关(该灯如为打开的, 则将它关闭;如关闭的,则将它打开)。以此类推,一共有n个人,求最后有多少盏灯是开着的?(就是这个题目,但是表述不太一样)
// 代码是我自己写的,笔试题也是白板直接提交,没有验证对错,仅供参考。 class Solution { public int openLights(int n) { int[] arr = new int[n + 1]; for (int i = 1; i < arr.length; i++) { arr[i] = 0; } for (int j = 1; j <= n; j++) { for (int i = 1; i < arr.length; i++) { if (i % j == 0) { arr[i] ^= 1; } } } int ans = 0; for (int i = 1; i < arr.length; i++) { ans += arr[i]; } return ans; } }
第二题:NC65 斐波那契数列
// 这是我知道的三种方法中最简单的答案。 public class Solution { public int Fibonacci(int n) { if (n <= 1) return n; int a = 0; int b = 1; for (int i = 2; i <= n; i++) { b = a + b; a = b - a; } return b; } }
Q:你这是用C语言写的吗?
A:不是,是Java。
Q:那怎么看起来和C/C++差不多?
A:😅。
Q:先来看看第一题,说一下你的思路?还有更简单的做法吗?
Q:第二题:经典的斐波那契数列,高频笔试面试的编程题,主要有三种写法:递归、动态规划(使用数组)、只使用额外几个变量而不创建数组(这叫啥法子啊😄)
hr面面经(都是闲聊,可不看)
方式:腾讯会议
时间:10月9日14:30
时长:20分钟(感觉聊了很多,应该更长吧)
hr:(一顿客套话,恭喜啊通过技术面啥的),现在是人事面,大概多久,主要就是想了解下候选人一些信息和想法啥的。
我:嗯嗯……
hr:你之前在这个xxxx公司实习,能说说吗?
我:巴拉巴拉……(反正就很好,钱多事少还远程😄)
hr:那你当时为什么没有留在xxxx。
我:主要是我想找Java岗,他们是python。
hr:那说说哪些让你觉得xxxx公司很好的吗?
我:制度完善、管理人性化……
hr:那你对赛宁了解吗?
我:目前只知道是做网络安全对,还没有深入了解,如果拿到offer了,会进一步深入了解的。
hr:那你拿到offer后,一般会看哪些或者考虑哪些呢?
我:嗯,首先是薪资啊,然后(就拿过一个offer,连offer上有啥都不清楚😅)……然后会考虑公司的行业、主要业务和发展前景。
hr:那我先给你介绍下我们公司吧。然后巴拉巴拉的,主要就是公司是做网络安全的,另一个就是CTF竞赛啥的。你之后可以了解下。
我:嗯嗯,会的。
hr:那关于薪资这块,你的期望薪资是多少?
我:你们能给到多少啊?
hr:我们目前还没有确定薪酬标准,因为你这是第一批,后面还有第二批,第三批,现在就是想了解下你的意愿,后面才能确定。
我:(应该问问往年的情况的)xx w 到 xx w吧。
hr:xx到xx,是一个月吗?
我:是年薪。
hr:那你有没有想过去上海或者杭州啊?这两个城市也挺近的。
我:上海应该是不会考虑的。杭州嘛,和南京也差不多啊之类的,除非能拿到比南京更好的offer才会考虑吧。反正优先选择南京。
hr:那比如杭州给你xx w(比我说的上限高一些的)年薪的offer,你会选择去杭州吗?
我:大体上还是会留在南京的(后来想想不该表现出留在南京的意愿太强烈)
hr:那你在投递简历的时候都是投递南京吗?
我:如果有南京的岗位,肯定是投递南京,没有的话,如果有北京,会选择北京吧。
hr:那你家在哪里啊?
我:xxx。
hr:那距离北京挺近的(其实一点也不近)。如果拿到北京的offer会考虑北京吗?
我:(北京虽好,但我不配😭)反正就是说,想我这种普通人去了,也只是过客,而且自己太喜欢南京,还是希望留在南京的……
(主要就是薪资、公司业务、城市选择这些)
hr:情况我基本了解了,那你有什么想问我的吗?
我:我大概多久知道面试结果啊?
hr:因为你这是第一批,要到第二批,第三批结束才会发offer。
我:哦哦哦。
hr:反正已经加了微信,有什么事你可以微信直接问我。
我:嗯嗯……
总结:一面都是基础,二面就是聊聊笔试题,然后就hr面,还是很容易,而且进度很快。
讨论&交流
这里汇总下自己当时没get到面试官想问的还有没有答好、不懂的问题:
- 查找数据的时间复杂度是多少?
- Redis存在什么问题吗?是Redis自身带有的问题,求教。
- 有什么方法可以查看Redis中的数据量?
- 怎样获取以xx前缀开头的数据?不能使用keys *命令。
- 关于hr面的:大家都是实话实说的吗?有没有注意点?经历的hr面太少了。