字节绩效开奖

近日,字节绩效开奖了。

这次的字节绩效和往年不同,主打一个区分度

字节的绩效分为「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

给你三个正整数 nindexmaxSum

你需要构造一个同时满足下述所有条件的数组 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

提示:

  • 字节跳动研发岗的年终奖。。_后端
  • 字节跳动研发岗的年终奖。。_后端_02

二分 + 贪心 + 数学

根据题意,容易想到以 ans 为分割点的正整数数组具有二段性,其中 ans 为最大的 字节跳动研发岗的年终奖。。_后端_03

小于等于 ans 的值均能通过直接调整 字节跳动研发岗的年终奖。。_后端_03 来构造,不会违反总和不超过 max 的限制;大于 ans 的值则无法满足 max 限制。

基于此我们可通过「二分」的方式来找分割点。

假设当前二分到的值为 x,考虑如何实现一个 check 函数,该函数用于判断 x 能否作为 字节跳动研发岗的年终奖。。_后端_03

为了令 字节跳动研发岗的年终奖。。_前端_06 时,数组总和 sum 不超过 max 限制,我们应当贪心构造 字节跳动研发岗的年终奖。。_数组_07 的剩余元素:从 字节跳动研发岗的年终奖。。_面试_08 开始往两侧构造,按照递减的方式进行逐个构造,若递减到 字节跳动研发岗的年终奖。。_后端_09

这样可确保构造出来的 字节跳动研发岗的年终奖。。_数组_07 既满足 字节跳动研发岗的年终奖。。_前端_06

字节跳动研发岗的年终奖。。_后端_12

位置 idx 的值为 x,其左边有 idx 个元素,其右边有 n - idx - 1 个元素。

利用「等差数列求和」公式分别从 x - 1 开始构造(注意:这里说的构造仅是计算 字节跳动研发岗的年终奖。。_数组_07 总和),若总和不超过 max 说明 字节跳动研发岗的年终奖。。_前端_06 满足要求,我们令 字节跳动研发岗的年终奖。。_数组_15,否则令 字节跳动研发岗的年终奖。。_后端_16

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;
};
  • 时间复杂度:字节跳动研发岗的年终奖。。_面试_17
  • 空间复杂度:字节跳动研发岗的年终奖。。_数组_18