7.24 华为提前批Java视频一面
全程一小时,非常准时,面试官也挺nice,就是我比较菜
- 聊项目相关,主要是 Kafka Connect 的一些知识
- Kafka 可靠性:zookeeper,分布式集群,partition 的 leader 和 follower
- 多进程之间的通信方式:管道、共享存储器、消息传递系统(翻了一下操作系统,发现 C/S 模式没答上来)
- Java 内存模型,说了一下作用还有主内存+工作内存,还有内存间相互操作的一些命令、约束
- Spring 微服务?(我简历里有提到 Spring,但是没有提到微服务,后面得知是部门业务相关所以问了)
- OpenStack 了解吗?(同上)
- 聊了一下7.15笔试的最后一题(完全背包)
- 手撕算法(详情见后文)
- volatile 能用来实现免锁队列吗?(我答的是不能保证原子性所以不能)
- 如何实现免锁队列?(答了CAS,队列元素用原子类包装)
- 面试官一直在问我免锁队列的关键指令是什么?我说了"CompareAndSet"才让他满意
反问环节:
- 我还有机会吗?—— 你们提前批都有
- 编码风格和习惯?—— 挺好的(主要是手撕算法结束之后,他特意提到编码风格,我就问了一下)
- 知识储备需要补充哪些内容?(扯到部门的业务上面去了……和我讲了讲 openstack)
手撕代码:
对字符串列表中的每个字符串进行压缩,输出一个压缩后的字符串列表,要求和原列表的位置相对应
- 压缩:保留头尾字符,中间用省略掉的字符个数填充,例如 kubernetes 压缩为 k8s
- 如果出现两个字符串的压缩结果相同,需要从左开始,减少省略的字符,直到压缩结果不同
- aabbcc & abbbcc => a4c, 改成 aa3c, ab3c
- 若压缩后的字符串长度没有比原来的短,就输出原先的字符串
- 提供一个辅助方法,它可以生成从字符串指定位置开始压缩得到的结果
public List<String> wordsCompress(List<String> data); private String compressHelper(String word, int start){ // compressHelper("internet", 1) -> "i6t" // compressHelper("internet", 2) -> "in5t" // compressHelper("internet", 3) -> "int4t" } // sample case // input {"like", "god", "me", "internet", "internal", "interval", "intension", "face", "intrusion"} // output {"l2e", "god", "me", "i6t", "internal", "interval", "inte4n", "f2e", "intr4n"}
说实话自己挺菜的,一开始想了个漏洞百出的错误思路,后来经过面试官提示才写出正确思路:
- 先预处理列表,把长度相同的字符串组织成一个列表,然后按长度存哈希表
- 再对每一个长度的哈希桶进行遍历,辅助函数的第二个参数从1递增,直到这个桶生成的不同的压缩结果数和桶内原列表的字符串数相等
- 整体的所有压缩结果用一个原字符串到压缩结果的字符串的哈希表存一下,方便生成结果