支付宝年终奖
这两天,脉脉上陆续有支付宝小伙伴爆料年终奖。
绝大多数爆料都是从脉脉官方渠道进行收集(打开特殊入口,填写表格),因此可信度较高,都带具体金额:
但可惜的是,脉脉统计年终奖爆料的时候,没有统计绩效系数是多少。
众所周知,阿里系的公司,采用的是双序列职业发展体系:
- M 序列代表管理路线,从 M1 到 M10
- P 序列代表技术路线,从 P4 到 P14
除了定级,另外一个和年终奖挂勾的是绩效系数,采取的是五分制:
- 2.5 及以下:不可接受
- 3:需要改进
- 3.25:需要提高
- 3.5:符合期望
- 3.75:部分超出期望
- 4:超出期望
- 4.5:一贯持续超出期望
- 5:卓越
常规分布基本是 2.53.25 占 10%,3.5 占 60%,3.755 占 30%,即 361 分布。
实际上基本都围绕着 3.25、3.5 和 3.75 这三档进行。
如果取得 3.75 系数的话,不仅会获得超额年终,还会有幅度较大的薪资涨幅。
例如这位网友:
定级 14,绩效 3.75,拿到年终奖 22W(不算 13 薪),薪资涨幅 14%,涨完后 base 来到了 57k。
这几年大家可没少吐槽支付宝,尤其是在越来越多人选择微信支付的今天。
但吐槽归吐槽,支付宝仍然是国内超一线互联网大厂,同时也是头巨大的现金奶牛。
...
回归主线。
来一道和「支付宝」相关的算法题。
题目描述
平台:LeetCode
题号:915
给定一个数组 nums
,将其划分为两个连续子数组 left
和 right
,使得:
left
中的每个元素都小于或等于right
中的每个元素。left
和right
都是非空的。left
的长度要尽可能小。
在完成这样的分组后返回 left
的长度。
用例可以保证存在这样的划分方法。
示例 1:
css
输入:nums = [5,0,3,8,6]
输出:3
解释:left = [5,0,3],right = [8,6]
示例 2:
css
输入:nums = [1,1,1,0,6,12]
输出:4
解释:left = [1,1,1,0],right = [6,12]
提示:
- <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 < = n u m s . l e n g t h < = 1 0 5 2 <= nums.length <= 10^5 </math>2<=nums.length<=105
- <math xmlns="http://www.w3.org/1998/Math/MathML"> 0 < = n u m s [ i ] < = 1 0 6 0 <= nums[i] <= 10^6 </math>0<=nums[i]<=106
- 可以保证至少有一种方法能够按题目所描述的那样对
nums
进行划分。
模拟
根据题意,我们知道本质是求分割点,使得分割点的「左边的子数组的最大值」小于等于「右边的子数组的最小值」。
我们可以先通过一次遍历(从后往前)统计出所有后缀的最小值 min
,其中 min[i] = x
含义为下标范围在 <math xmlns="http://www.w3.org/1998/Math/MathML"> [ i , n − 1 ] [i, n - 1] </math>[i,n−1] 的 <math xmlns="http://www.w3.org/1998/Math/MathML"> n u m s [ i ] nums[i] </math>nums[i] 的最小值为 x
,然后再通过第二次遍历(从前往后)统计每个前缀的最大值(使用单变量进行维护),找到第一个符合条件的分割点即是答案。
Java 代码:
Java
class Solution {
public int partitionDisjoint(int[] nums) {
int n = nums.length;
int[] min = new int[n + 10];
min[n - 1] = nums[n - 1];
for (int i = n - 2; i >= 0; i--) min[i] = Math.min(min[i + 1], nums[i]);
for (int i = 0, max = 0; i < n - 1; i++) {
max = Math.max(max, nums[i]);
if (max <= min[i + 1]) return i + 1;
}
return -1; // never
}
}
C++ 代码:
C++
class Solution {
public:
int partitionDisjoint(vector<int>& nums) {
int n = nums.size();
vector<int> arr(n + 10);
arr[n - 1] = nums[n - 1];
for (int i = n - 2; i >= 0; i--) arr[i] = min(arr[i + 1], nums[i]);
int maxv = 0;
for (int i = 0; i < n - 1; i++) {
maxv = max(maxv, nums[i]);
if (maxv <= arr[i + 1]) return i + 1;
}
return -1; // never
}
};
Python 代码:
Python
class Solution:
def partitionDisjoint(self, nums: List[int]) -> int:
n = len(nums)
minv = [0] * (n + 10)
minv[n - 1] = nums[n - 1]
for i in range(n - 2, -1, -1):
minv[i] = min(minv[i + 1], nums[i])
maxv = 0
for i in range(n - 1):
maxv = max(maxv, nums[i])
if maxv <= minv[i + 1]:
return i + 1
return -1
TypeScript 代码:
TypeScript
function partitionDisjoint(nums: number[]): number {
const n = nums.length
const min = new Array<number>(n + 10).fill(nums[n - 1])
for (let i = n - 2; i >= 0; i--) min[i] = Math.min(min[i + 1], nums[i])
for (let i = 0, max = 0; i < n; i++) {
max = Math.max(max, nums[i])
if (max <= min[i + 1]) return i + 1
}
return -1
}
- 时间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n ) O(n) </math>O(n)
- 空间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n ) O(n) </math>O(n)
最后
给大伙通知一下 📢 :
全网最低价 LeetCode 会员目前仍可用!!!
📅 年度会员:有效期加赠两个月!! ; 季度会员:有效期加赠两周!!
🧧 年度会员:获 66.66 现金红包!! ; 季度会员:获 22.22 现金红包!!
🎁 年度会员:参与当月丰厚专属实物抽奖(中奖率 > 30%)!!
专属链接:leetcode.cn/premium/?pr...
更多详情请戳 这里 。
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉