S*皮
最近,一篇源自「大厂同事圈」的爆料火了,帖子里仔细梳理了这家大厂历年来的"神操作"。
21 年,以 15 薪 + WLB 为噱头进行大肆招聘,当时高管扬言,未来深圳总部的人员要扩编一倍。
22 年,公司流动性吃紧,开始进行"降本增效",零食饮料水果等福利开始取消。九月份开启首次大裁员。到了年底,无普调,正常绩效(B)年终只有 0.5 个月。
23 年,年初时,关于 22 年只有 0.5 个月年终的骂声仍未消停,某高层直接开启 3 月份的自提礼包(可报名离职,拿赔偿走人)活动,扬言要让离开的人后悔。放话后续阳光普调 5%,年终 back two normal。又到年底,正常绩效(B)2 个月,卡晋升。
24 年,开启考勤管理,严格执行工作日需在岗满 9.5 小时,下半年公司股价重回 100+,领导继续放话年终 diff last year。年底,以股票涨了为理由不给普调,正常绩效(B)还是 2 个月,还是卡晋升。
总的下来,当时 21 年冲着「15 薪 + WLB」入职的小伙伴,最终三年(正常绩效)下来,只收获到了 4.5 个月年终奖,以及逐渐收紧的福利,逐步加强的管理 🤣🤣🤣
这大饼看得我是一愣一愣的,成功消除了我昨天因为 华为人均年终 产生的不适感。
对此,你怎么看?过去几年的年终奖,是否有跑赢该大厂?欢迎评论区交流。
...
回归主题。
来一道和 HOT 100 级别的经典题。
题目描述
平台:LeetCode
题号:1305
给你 root1
和 root2
这两棵二叉搜索树。
请你返回一个列表,其中包含两棵树中的所有整数并按升序排序。
示例 1:
输入:root1 = [2,1,4], root2 = [1,0,3]
输出:[0,1,1,2,3,4]
示例 2:
输入:root1 = [1,null,8], root2 = [8,1]
输出:[1,1,8,8]
提示:
- 每棵树的节点数在 范围内
中序遍历 + 归并排序
利用 BST
中序遍历的有序性质,我们可以先对两棵树进行中序遍历,从而将树的结构转换为线性结构。
将两个有序序列合并成一个有序序列则是利用了经典的「归并排序」。
Java 代码:
class Solution {
int INF = 0x3f3f3f3f;
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
List<Integer> ans = new ArrayList<>();
List<Integer> l1 = new ArrayList<>(), l2 = new ArrayList<>();
dfs(root1, l1); dfs(root2, l2);
int n = l1.size(), m = l2.size(), i = 0, j = 0;
while (i < n || j < m) {
int a = i < n ? l1.get(i) : INF, b = j < m ? l2.get(j) : INF;
if (a <= b) {
ans.add(a); i++;
} else {
ans.add(b); j++;
}
}
return ans;
}
void dfs(TreeNode root, List<Integer> list) {
if (root == null) return ;
dfs(root.left, list);
list.add(root.val);
dfs(root.right, list);
}
}
C++ 代码:
class Solution {
public:
vector<int> getAllElements(TreeNode* root1, TreeNode* root2) {
int INF = 0x3f3f3f3f;
vector<int> ans;
vector<int> l1, l2;
dfs(root1, l1); dfs(root2, l2);
int n = l1.size(), m = l2.size(), i = 0, j = 0;
while (i < n || j < m) {
int a = (i < n) ? l1[i] : INF, b = (j < m) ? l2[j] : INF;
if (a <= b) {
ans.push_back(a); i++;
} else {
ans.push_back(b); j++;
}
}
return ans;
}
void dfs(TreeNode* root, vector<int>& list) {
if (!root) return;
dfs(root->left, list);
list.push_back(root->val);
dfs(root->right, list);
}
};
Python 代码:
class Solution:
def getAllElements(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> List[int]:
INF = 0x3f3f3f3f
ans = []
l1, l2 = [], []
self.dfs(root1, l1)
self.dfs(root2, l2)
n, m, i, j = len(l1), len(l2), 0, 0
while i < n or j < m:
a, b = l1[i] if i < n else INF, l2[j] if j < m else INF
if a <= b:
ans.append(a)
i += 1
else:
ans.append(b)
j += 1
return ans
def dfs(self, root: TreeNode, arr: list[int]) -> None:
if not root:
return
self.dfs(root.left, arr)
arr.append(root.val)
self.dfs(root.right, arr)
TypeScript 代码:
function dfs(root: TreeNode | null, list: number[]): void {
if (root === null) return;
dfs(root.left, list);
list.push(root.val);
dfs(root.right, list);
}
function getAllElements(root1: TreeNode | null, root2: TreeNode | null): number[] {
const INF = 0x3f3f3f3f;
let ans = [];
let l1 = [], l2 = [];
dfs(root1, l1);
dfs(root2, l2);
let n = l1.length, m = l2.length, i = 0, j = 0;
while (i < n || j < m) {
let a = i < n ? l1[i] : INF;
let b = j < m ? l2[j] : INF;
if (a <= b) {
ans.push(a); i++;
} else {
ans.push(b); j++;
}
}
return ans;
};
- 时间复杂度:令 和 分别为两棵树的节点数量,跑中序遍历的复杂度为 ,构建答案复杂度为 。整体复杂度为
- 空间复杂度: