大家好!我是鸭鸭。
昨天字节跳动又发了一封全员信。
临近年终,各家公司裁员新闻不断的时候,字节反而要加码年终激励力度,对高绩效人才发放更多的期权。
今年年初,字节就更新过一次年终激励方式,而且字节员工之前的总包期权是按照季度归属。
这次则从 3 个方面进行了调整:
- 扩大计算基础,以月总包取代月薪来计算绩效期权,基数中不仅包括了原有的现金形式的月薪,还新增了总包中的期权月均价值,使得整体激励基数变得更大。
- 股数方面,会额外给高绩效员工增发一定比例(约 10%)。
- 月数方面,高绩效员工的激励月数上限有所提升。
自 2017 年以来,字节跳动每年都会为员工提供期权回购机会。最近一次回购活动就在 2024 年 10 月,回购价为每股 180.7 美元。
这一次字节的年终激励加码,给得还是很大方的,特别对绩效高的员工来说,到手的更多了。据说新方案会在 2024 年全年绩效评估中首次启用。
不过鸭鸭也看到有同学吐槽说更喜欢京东的 20 薪,还是现金香,不知道让你来选,会选哪一种呢?
……
大厂福利是真的香,如果不想只能在梦里做选择,那就快点开始刷题准备面试吧~
今天鸭鸭也为大家准备一份抖音的面经,大家也可以到面试鸭小程序里看其他大厂面经:
Java 抖音(校招)一面
做这个项目时遇到的印象比较深刻的问题
session 在 redis 中是如何存储的?
-
- Redis 分布式 Session 实现用户登录的原理是什么?
Redis 有哪些数据结构?
-
- Redis 中常见的数据类型有哪些?
Redis 的 Zset 底层是如何实现的?
Redis 中的 Zset 是基于跳表和哈希表实现的
- 跳表用于实现分值排序和高效的范围查询。
- 哈希表用于快速查找 member 的 score ,确保元素的唯一性。
-
- 如何使用 Redis 快速实现排行榜?
操作系统中的进程和线程有何区别?
-
- 线程和进程有什么区别?
为什么在设计并发时不使用进程,而是使用线程?
主要是资源和效率问题。进程的创建、切换和销毁需要较大的系统资源开销,且之间的通信相对复杂,比如管道、消息队列都需要额外的系统调用或者数据拷贝。
而线程就比较轻量级。
在项目中有哪些使用多线程的场景?
volatile 关键字的作用是什么?
-
- Java 中 volatile 关键字的作用是什么?
为什么会出现一个线程更改了数据,而其他线程读不到的情况?
-
- 什么是 Java 内存模型(JMM)?
ThreadLocal 的基本原理是什么?ThreadLocal 中 map 的 key 是什么?
-
- Java 中的 ThreadLocal 是如何实现线程资源隔离的?
-
- 为什么 Java 中的 ThreadLocal 对 key 的引用为弱引用?
算法:如何在数组中滑动窗口的过程中找出每一个窗口的最大值?
-
- 滑动窗口最大值
一个系统中,记录处理用户提交的订单的耗时,得到实时流式输入的耗时数据的中位数
使用两个堆(大顶堆和小顶堆)
维护一个大顶堆和一个小顶堆。
大顶堆存储较小的一半数据,小顶堆存储较大的一半数据。
当新数据到来时:
如果大顶堆为空或者新数据小于等于大顶堆的堆顶元素,将新数据插入大顶堆;否则,将新数据插入小顶堆。
然后进行调整,使两个堆的元素数量差不超过 1。
要获取中位数:
如果两个堆的元素数量相同,中位数为两个堆顶元素的平均值;如果大顶堆的元素数量比小顶堆多 1,大顶堆的堆顶元素为中位数;反之,小顶堆的堆顶元素为中位数。
插入数据和获取中位数的时间复杂度都为 O(log n),效率较高。
import java.util.PriorityQueue;
class MedianCalculator {
private PriorityQueue<Integer> maxHeap; // 存储较小的一半数据
private PriorityQueue<Integer> minHeap; // 存储较大的一半数据
public MedianCalculator() {
maxHeap = new PriorityQueue<>((a, b) -> b - a);
minHeap = new PriorityQueue<>();
}
public void insertData(int data) {
if (maxHeap.isEmpty() || data <= maxHeap.peek()) {
maxHeap.offer(data);
} else {
minHeap.offer(data);
}
// 调整两个堆的大小
if (maxHeap.size() > minHeap.size() + 1) {
minHeap.offer(maxHeap.poll());
} else if (minHeap.size() > maxHeap.size()) {
maxHeap.offer(minHeap.poll());
}
}
public double getMedian() {
if (maxHeap.size() == minHeap.size()) {
return (maxHeap.peek() + minHeap.peek()) / 2.0;
} else if (maxHeap.size() > minHeap.size()) {
return maxHeap.peek();
} else {
return minHeap.peek();
}
}
public static void main(String[] args) {
MedianCalculator calculator = new MedianCalculator();
calculator.insertData(5);
calculator.insertData(3);
calculator.insertData(7);
calculator.insertData(2);
calculator.insertData(6);
System.out.println("中位数: " + calculator.getMedian());
}
}