lucifer

最近字节跳动又放大招,员工们怕是已经在偷偷乐开了花!据内部消息,字节刚刚启动了新一轮期权回购,价格直接炸裂:在职员工每股税前180.7美元(约合人民币1308元),离职员工也有153.6美元(约合人民币1088元)。这价格比半年前的回购价硬生生涨了近6%!要知道,去年同期才160美元,这一年时间,期权价格跟坐火箭似的,员工手里的“纸面财富”又增值了一波,属实赢麻了!

期权回购,员工的“钞能力”时刻

期权回购这事儿,说白了就是公司掏真金白银,把员工手里的期权换成现金,妥妥的变现机会。对于字节的员工来说,这不仅是一次“落袋为安”的好时机,更是公司实力和信心的明晃晃展示。180.7美元的回购价,啥概念?比2023年10月的160美元高了12.9%,比2021年的126美元更是翻了快1.5倍!这涨势,简直让其他打工人看了都想喊一句:“求字节赏个工位!”

更别提字节这波回购还带着浓浓的“宠员工”属性。不仅在职员工能吃到高价回购的红利,连离职员工也能分一杯羹,153.6美元的价格虽然比在职的低点,但也比去年的折扣价厚道多了。字节这操作,简直是把“以人为本”写在了脸上,既让现员工安心,也给老员工留了份念想。

估值狂飙,字节底气有多足?

期权回购价一涨再涨,背后是字节跳动估值的疯狂进击。据业内消息,这波回购对应的公司估值已经飙到了3000亿美元(约合人民币2.17万亿元),妥妥站稳全球未上市科技公司的头把交椅。想想2021年字节估值最高接近4000亿美元,后来市场波动有所回落,但现在又稳稳爬回3000亿大关,这韧性,牛!

更让人瞠目结舌的是,字节最近还传出签了一笔108亿美元(约合人民币764亿元)的超级融资,堪称亚洲(除日本外)史上最大美元企业融资之一。这钱袋子一鼓,字节的底气自然更足。无论是继续深耕抖音、头条等核心业务,还是加码AI、国际化布局,字节的野心和实力都摆在那儿,员工手里的期权含金量自然也水涨船高。

高情商操作:稳人才,拉投资,双赢!

字节这波回购操作,简直是教科书级别的“高情商”。对内,高价回购直接给员工发福利,既能让核心人才安心留下来打拼,也能激励大家继续冲业绩。毕竟,谁不想在一家估值狂飙、福利拉满的公司里干活?对外,这波回购等于在向市场喊话:“我们不差钱,未来可期!”3000亿美元的估值、108亿美元的融资,哪个投资者看了不心动?字节这是在用实力告诉大家:跟着我混,有肉吃!

更妙的是,字节压根没急着IPO。不少公司为了上市忙得焦头烂额,字节却稳如老狗,靠回购给员工和投资者提供流动性,愣是把“上市焦虑”变成了“回购狂欢”。这格局,属实有点东西。

员工狂欢,字节的“钞能力”还能持续多久?

看到字节员工这波期权回购的红利,网上已经炸开了锅。有人调侃:“字节员工是不是得提前规划买房买车了?”也有人酸溜溜:“这期权比我工资还香,投简历还来得及吗?”不过玩笑归玩笑,字节这几年能把期权回购玩得这么溜,核心还是因为业务硬、钱包厚。从抖音的广告和电商收入,到海外TikTok的逆势增长,字节的营收增长势头一点没慢。据说今年上半年,字节国际收入直接暴涨60%,总收入更是突破730亿美元,换谁不眼红?

当然,字节的“钞能力”也不是没挑战。全球监管压力、行业竞争、AI投入的烧钱大战,哪一项都不轻松。但从这波回购来看,字节显然信心满满。员工期权价格年年涨,估值稳稳回升,这不就是在告诉大家:未来还有得玩!

事件总结

字节这波期权回购,员工是真赢麻了!180.7美元的回购价,不仅让在职的小伙伴们荷包鼓鼓,也给离职的留下了份“回忆杀”。更别提3000亿美元的估值和108亿美元的融资,字节这艘巨轮开得稳稳当当。打工人谁不羡慕?谁不想去字节“搬砖”?只能说,字节这波操作,又给互联网行业上了一课:有钱有实力,才能让员工和市场都服气!

回归正题,我们来一道力扣中等题目 3468. 可行数组的数目,也是第 151 期双周赛中的题目, rate 分 1545。

题目描述

给定一个整数数组 original 和一个二维整数数组 bounds,其中 bounds[i] = [lower_i, upper_i] 表示第 i 个元素的值必须在 [lower_i, upper_i] 范围内。
一个数组 copyoriginal 的一个复制数组,当且仅当对于每个 icopy[i] - copy[i-1] = original[i] - original[i-1](对于 i > 0),且 copy[i][lower_i, upper_i] 范围内。
返回满足条件的 copy 数组的数量。

示例 1:

1
2
3
输入: original = [1,2,3], bounds = [[1,1],[2,2],[3,3]]
输出: 1
解释: 只有 [1,2,3] 满足条件。

示例 2:

1
2
3
输入: original = [1,3], bounds = [[1,2],[3,4]]
输出: 2
解释: [1,3] 和 [2,4] 都满足条件。

约束:

  • 1 <= original.length <= 100
  • 1 <= original[i] <= 10^9
  • bounds.length == original.length
  • bounds[i].length == 2
  • 1 <= bounds[i][0] <= bounds[i][1] <= 10^9

思路

这道题的关键在于理解 copy 数组的生成规则和约束条件:

  1. 规律分析
    根据题目定义,copy[i] - copy[i-1] = original[i] - original[i-1],这意味着一旦确定了 copy[0],整个 copy 数组就完全确定了。
    具体来说,copy[i] = copy[0] + (original[i] - original[0])

  2. 问题转化
    我们需要枚举所有可能的 copy[0] 值,并确保生成的 copy 数组每个元素都满足 bounds[i] 的范围约束。
    对于每个位置 i,我们可以根据 copy[0] 和公式推导出 copy[i] 的范围:

    • bounds[i][0] <= copy[i] <= bounds[i][1]
    • 代入公式:bounds[i][0] <= copy[0] + (original[i] - original[0]) <= bounds[i][1]
    • 移项得到关于 copy[0] 的约束:
      1
      bounds[i][0] - (original[i] - original[0]) <= copy[0] <= bounds[i][1] - (original[i] - original[0])
  3. 区间交集
    每个位置 i 都会对 copy[0] 产生一个区间约束,最终答案是所有这些区间的交集长度。
    交集的左端点是所有区间左端点的最大值,右端点是所有区间右端点的最小值。如果左端点大于右端点,说明没有合法解,返回 0。

  4. 实现步骤

    • 计算每个位置 icopy[0] 的约束区间。
    • 求所有区间的交集。
    • 计算交集内的整数个数。

代码

以下是多种语言的实现,代码简洁清晰:

Python 3

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def countArrays(self, original: List[int], bounds: List[List[int]]) -> int:
n = len(original)
left, right = float('-inf'), float('inf')
for i in range(n):
diff = original[i] - original[0]
l = bounds[i][0] - diff
r = bounds[i][1] - diff
left = max(left, l)
right = min(right, r)
return max(0, right - left + 1)

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public int countArrays(int[] original, int[][] bounds) {
int n = original.length;
long left = Long.MIN_VALUE, right = Long.MAX_VALUE;
for (int i = 0; i < n; i++) {
long diff = original[i] - original[0];
long l = bounds[i][0] - diff;
long r = bounds[i][1] - diff;
left = Math.max(left, l);
right = Math.min(right, r);
}
return left > right ? 0 : (int)(right - left + 1);
}
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int countArrays(vector<int>& original, vector<vector<int>>& bounds) {
int n = original.size();
long long left = LLONG_MIN, right = LLONG_MAX;
for (int i = 0; i < n; i++) {
long long diff = original[i] - original[0];
long long l = bounds[i][0] - diff;
long long r = bounds[i][1] - diff;
left = max(left, l);
right = min(right, r);
}
return left > right ? 0 : (int)(right - left + 1);
}
};

JavaScript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @param {number[]} original
* @param {number[][]} bounds
* @return {number}
*/
var countArrays = function(original, bounds) {
const n = original.length;
let left = -Infinity, right = Infinity;
for (let i = 0; i < n; i++) {
const diff = original[i] - original[0];
const l = bounds[i][0] - diff;
const r = bounds[i][1] - diff;
left = Math.max(left, l);
right = Math.min(right, r);
}
return left > right ? 0 : right - left + 1;
};

Go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
func countArrays(original []int, bounds [][]int) int {
n := len(original)
left, right := int64(-1<<63), int64(1<<63-1)
for i := 0; i < n; i++ {
diff := int64(original[i] - original[0])
l := int64(bounds[i][0]) - diff
r := int64(bounds[i][1]) - diff
if l > left {
left = l
}
if r < right {
right = r
}
}
if left > right {
return 0
}
return int(right - left + 1)
}

复杂度分析

  • 时间复杂度: $O(n)$,其中 n 是 original 数组的长度。只需要遍历一次数组,计算每个位置的约束并更新交集的左右端点。
  • 空间复杂度: $O(1)$,仅使用常数级别的额外空间存储左右端点。

总结

这道题的核心是将问题转化为求多个区间的交集。通过分析 copy 数组的生成规则,我们发现只需确定 copy[0] 的取值范围即可。利用数学推导,将每个位置的约束转化为关于 copy[0] 的区间,然后通过取所有区间左端点的最大值和右端点的最小值即可快速求解。

力扣专属折扣

力扣免费题目已经有了很多经典的了,也覆盖了所有的题型,只是很多公司的真题都是锁定的。个人觉得如果你准备找工作的时候,可以买一个会员。另外会员很多 leetbook 也可以看,结合学习计划,效率还是蛮高的。

现在力扣在每日一题基础上还搞了一个 plus 会员挑战,每天刷题可以获得积分,积分可以兑换力扣周边。

如果你要买力扣会员的话,这里有我的专属力扣折扣:https://leetcode.cn/premium/?promoChannel=lucifer (年度会员多送两个月会员,季度会员多送两周会员)


 评论


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material X 作为主题 。
载入天数...载入时分秒...