一面 8.30
问题
自我介绍
介绍简历上准备的RPC项目
项目中用到了序列化反序列化,说一下概念
java反射, 使用场景(只说了方便传递字符串来创建对象可配置化)(哈哈刚刚想起来,jdk动态代理也是反射)
接口和抽象类区别、什么时候用
java内部类静态内部类
知道匿名内部类吗?
final关键字
面向对象三大特性
线程池是什么
线程池是怎么实现的(说了 核心线程 阻塞队列一些东西)
进程线程区别
线程状态
进程之间隔离的吗
垃圾回收了解吗,垃圾回收机制(GC ROOT 可达性分析 分代垃圾回收算法... 背的啥统统怼上)
强软弱虚引用
了解泛型吗?泛型擦除?(面试官稍微引导了一下,我说一下Object)
HTTP HTTPS
SSL/TLS 怎么保证加密的
会那些语言?
对前端的了解?
算法题
set 和 排序 的方法不可以。于是用了原地交换的方法
剑指 Offer 03. 数组中重复的数字 - 力扣(LeetCode) (leetcode-cn.com)
二面 9.2
问题
自我介绍
项目中遇到的困难
为啥来客户端
你是不是没学客户端的技术啊?
进程线程区别 (我喜欢从历史上说先用进程再有线程,面试官不喜欢我讲历史,那我直接背八股:线程是调度的基本单位,进程是资源基本单位,balabala)
线程多了怎么办(回答用线程池)
多个线程之间会有同步问题怎么解决(synchorized wait/notify juc包里的类 )
了解设计模式吗,使用过设计模式吗
写个单例模式。(先写了个懒汉,他说“你直接放大招吧”(不是原话),啪的一下给写了个双重锁校验)
就着 双重校验锁 问 synchorized 后面小括号包围的是啥(是类对象,只是拿着他当锁对象)
接着问,那这个类啥时候加载(看我迟钝了,他说你不会就直说吧,咱们赶时间)
HTTP属于OSI那一层呀
HTTP HTTPS 区别(说多个S, 多个安全层)
SSL/TLS 怎么保证安全的(说了TSL四次握手,之后的通讯使用会话密钥)
对了说握手的时候他打断(其实面试官在面试开始就给我打预防针了“小伙子我会打断你奥~~”)我,说网络上传递的是私匙还是公钥(当然是公钥了,名字就是公,不然为啥取这个名字啊)
算法题
给出一个乱序数组,输出排序后临近元素最大的差值。例如 nums = [4, 1, 2]
。 排序后 [1,2,4]
。因为 2
和 4
有最大的差值2
,答案是2
。要求最优时间复杂度, 空间复杂度没限制。(当时说了先排序再遍历的思路很明显不是最好的解答。没办法让撕个了快排了事)
————————————————更新分割线—————————————————————————
题目还是很不错的。搜查到很好的文章:漫画算法:无序数组排序后的最大相邻差值
贴出来自己在面试完后写的代码:
计数排序法
时间复杂 O(n) 空间取决于最大最小值
def solve(nums): min_ = min(nums) max_ = max(nums) cntArr = [0] * (max_ - min_ + 1) for num in nums: cntArr[num - min_] += 1 ans = 0 cnt = 0 # 数连续0的个数 for item in cntArr: if item == 0: cnt += 1 elif item != 0: ans = max(ans, cnt) cnt = 0 return ans + 1 if __name__ == '__main__': nums = [2, 6, 3, 4, 5, 10, 9] print(solve(nums))
基于桶排序的方法
时间复杂 O(n) 空间 O(n)
class Bucket: # 自己定义一个桶 def __init__(self): self.arr = [] self.max = float('-inf') self.min = float('inf') def put(self, num): self.max = max(self.max, num) self.min = min(self.min, num) self.arr.append(num) def isEmpty(self): return len(self.arr) == 0 def solve(nums): n = len(nums) buckets = [Bucket() for _ in range(n + 1)] # 小灰给出的方法三中, 分成 n + 1 个桶 , d = (max(nums) - min(nums)) / n # 空涵盖的范围 for num in nums: buckets[int((num - min(nums)) / d)].put(num) # 放入桶中 ans = 0 start = 0 for idx, bucket in enumerate(buckets): # 第一个桶和最后一个桶永远都是有数字的 找起始空桶和结束空桶还是很简单的 if not buckets[idx - 1].isEmpty() and bucket.isEmpty(): start = buckets[idx - 1].max elif buckets[idx - 1].isEmpty() and not bucket.isEmpty(): ans = max(ans, bucket.min - start) start = 0 return ans if __name__ == '__main__': nums = [2, 6, 3, 4, 5, 10, 9] print(solve(nums))
全部评论
(5) 回帖