首页 > 字节中台客户端一二面面经
头像
DownUp子
编辑于 2021-09-02 22:08
+ 关注

字节中台客户端一二面面经

一面 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] 。因为 24 有最大的差值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) 回帖
加载中...
话题 回帖

相关热帖

近期热帖

近期精华帖

热门推荐