字节绩效开奖
近日,字节绩效开奖了。
这次的字节绩效和往年不同,主打一个「区分度」。
字节的绩效分为「f、i、m-、m、m+、e、e+、o」几档(从小到大),但通常会集中在中间四档,即「m-、m、m+、e」。
对应的绩效奖金通常是 1.5-2 个月(m-)、3 个月(m)、4-4.5 个月(m+)、7-9 个月(e)。
往年来说,通常这几档的分布为 1531,而今年,差不多就是 3331。
也就是 m- 的人变多了。
m- 关乎的不只是绩效,还有后面的发展。
如果得了一次 m-,可主动要 n+1,如果两次 m-,就要走人了(被动 n+1)。
像此类的绩效评估上的改动,对员工的影响几乎就是全覆盖的,即使这次没有 m-,也会担心下次是否轮到自己,暗地里可能会密谋出路。
往树上开一枪,最担惊受怕的往往是还没中枪的鸟儿。
对此,你怎么看?
...
回归主线。
来一道近期「字节社招」中出现的算法原题。
题目描述
平台:LeetCode
题号:1802
给你三个正整数 n
、index
和 maxSum
。
你需要构造一个同时满足下述所有条件的数组 nums
(下标 从 0
开始 计数):
-
nums.length == n
-
nums[i]
是 正整数 ,其中0 <= i < n
-
abs(nums[i] - nums[i+1]) <= 1
,其中0 <= i < n-1
-
nums
中所有元素之和不超过maxSum
-
nums[index]
的值被 最大化 -
返回你所构造的数组中的 nums[index]
注意:abs(x)
等于 x
的前提是 x >= 0
;否则,abs(x)
等于 -x
。
示例 1:
输入:n = 4, index = 2, maxSum = 6
输出:2
解释:数组 [1,1,2,1] 和 [1,2,2,1] 满足所有条件。不存在其他在指定下标处具有更大值的有效数组。
示例 2:
输入:n = 6, index = 1, maxSum = 10
输出:3
提示:
二分 + 贪心 + 数学
根据题意,容易想到以 ans
为分割点的正整数数组具有二段性,其中 ans
为最大的
。
小于等于 ans
的值均能通过直接调整
来构造,不会违反总和不超过 max
的限制;大于 ans
的值则无法满足 max
限制。
基于此我们可通过「二分」的方式来找分割点。
假设当前二分到的值为 x
,考虑如何实现一个 check
函数,该函数用于判断 x
能否作为
:
为了令
时,数组总和 sum
不超过 max
限制,我们应当贪心构造
的剩余元素:从
开始往两侧构造,按照递减的方式进行逐个构造,若递减到
则维持不变。
这样可确保构造出来的 既满足 同时元素总和最小。

位置 idx
的值为 x
,其左边有 idx
个元素,其右边有 n - idx - 1
个元素。
利用「等差数列求和」公式分别从 x - 1
开始构造(注意:这里说的构造仅是计算
总和),若总和不超过 max
说明
满足要求,我们令
,否则令
。
Java 代码:
class Solution {
public int maxValue(int n, int index, int max) {
long l = 1, r = max;
while (l < r) {
long mid = l + r + 1 >> 1;
if (check(n, mid, index, max)) l = mid;
else r = mid - 1;
}
return (int) r;
}
boolean check(int n, long x, int idx, int max) {
long sum = x;
if (idx > x - 1) {
long an = x - 1, a1 = 1, cnt = x - 1;
sum += cnt * (a1 + an) / 2;
sum += idx - cnt;
} else {
long cnt = idx, an = x - 1, a1 = an - cnt + 1;
sum += cnt * (a1 + an) / 2;
}
if (n - idx - 1 > x - 1) {
long an = x - 1, a1 = 1, cnt = x - 1;
sum += cnt * (a1 + an) / 2;
sum += n - idx - 1 - cnt;
} else {
long cnt = n - idx - 1, an = x - 1, a1 = an - cnt + 1;
sum += cnt * (a1 + an) / 2;
}
return sum <= max;
}
}
C++ 代码:
class Solution {
public:
int maxValue(int n, int index, int maxSum) {
long l = 1, r = maxSum;
while (l < r) {
long mid = (l + r + 1) >> 1;
if (check(n, mid, index, maxSum)) l = mid;
else r = mid - 1;
}
return (int) r;
}
bool check(int n, long x, int idx, int maxSum) {
long sum = x;
if (idx > x - 1) {
long an = x - 1, a1 = 1, cnt = x - 1;
sum += cnt * (a1 + an) / 2;
sum += idx - cnt;
} else {
long cnt = idx, an = x - 1, a1 = an - cnt + 1;
sum += cnt * (a1 + an) / 2;
}
if (n - idx - 1 > x - 1) {
long an = x - 1, a1 = 1, cnt = x - 1;
sum += cnt * (a1 + an) / 2;
sum += n - idx - 1 - cnt;
} else {
long cnt = n - idx - 1, an = x - 1, a1 = an - cnt + 1;
sum += cnt * (a1 + an) / 2;
}
return sum <= maxSum;
}
};
Python 代码:
class Solution:
def maxValue(self, n: int, index: int, maxSum: int) -> int:
l, r = 1, maxSum
while l < r:
mid = (l + r + 1) >> 1
if self.check(n, mid, index, maxSum):
l = mid
else:
r = mid - 1
return int(r)
def check(self, n, x, idx, maxSum):
sumv = x
if idx > x - 1:
an, a1, cnt = x - 1, 1, x - 1
sumv += cnt * (a1 + an) // 2
sumv += idx - cnt
else:
cnt, an, a1 = idx, x - 1, x - idx
sumv += cnt * (a1 + an) // 2
if n - idx - 1 > x - 1:
an, a1, cnt = x - 1, 1, x - 1
sumv += cnt * (a1 + an) // 2
sumv += n - idx - 1 - cnt
else:
cnt, an, a1 = n - idx - 1, x - 1, x - n + idx + 1
sumv += cnt * (a1 + an) // 2
return sumv <= maxSum
TypeScript 代码:
function maxValue(n: number, index: number, maxSum: number): number {
const check = function(n: number, x: number, idx: number, maxSum: number): boolean {
let sum = x;
if (idx > x - 1) {
let an = x - 1, a1 = 1, cnt = x - 1;
sum += cnt * (a1 + an) / 2;
sum += idx - cnt;
} else {
let cnt = idx, an = x - 1, a1 = an - cnt + 1;
sum += cnt * (a1 + an) / 2;
}
if (n - idx - 1 > x - 1) {
let an = x - 1, a1 = 1, cnt = x - 1;
sum += cnt * (a1 + an) / 2;
sum += n - idx - 1 - cnt;
} else {
let cnt = n - idx - 1, an = x - 1, a1 = an - cnt + 1;
sum += cnt * (a1 + an) / 2;
}
return sum <= maxSum;
};
let l = 1, r = maxSum;
while (l < r) {
let mid = (l + r + 1) >> 1;
if (check(n, mid, index, maxSum)) l = mid;
else r = mid - 1;
}
return r;
};
-
时间复杂度: -
空间复杂度:
最后
给大伙通知一下 📢 :
全网最低价 LeetCode 会员目前仍可用,快来薅羊毛!!!
📅 年度会员:有效期加赠两个月!!; 季度会员:有效期加赠两周!!
🧧 年度会员:获 66.66 现金红包!!; 季度会员:获 22.22 现金红包!!
🎁 年度会员:参与当月丰厚专属实物抽奖(中奖率 > 30%)!!
💡 购买会员立即生效,福利将在次月 10 号前发放~
🙌 超多小伙伴已享受,快来薅羊毛 !👇
专属链接:https://leetcode.cn/premium/?promoChannel=acoier
更多详情请戳 这里 。
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉