2025,美团发放全员可领的春节红包,网友们笑了。。

376 阅读4分钟

特别红包

刚刚,美团宣布发放春节特别红包,庆祝美团成立十五周年。

正式员工每人 588 元,实习生每人 188 元,以美团卡的形式发放(直接充进美团账号),既可以自己领取,也可以直接转赠亲友,金额可直接用于消费。

对美团员工来说,当然是好事儿,红包是越多越好,没人嫌少。

但这实打实的福利,也未能逃脱网友们的"毒舌"(网友们真的很严格):

一些带着其他大厂的职业认证标识的网友们,觉得这红包也忒小了。

尤其是未能躲过「字节跳动」小伙伴的嘲讽,毕竟这 588 只能排到字节春节红包中的倒数第二档 🤣🤣

字节春节红包的规格为「3688/1888/988/588/288」共 5 档,红包金额和司龄相对应,分别是「>3年/13年/612个月/3~6个月/<3个月 or 实习生」,但 2025 年将是最后发放的一年。

但要我说,美团的小伙伴不必在意,他笑他的,你领你的,这放糖的白开水,大可放心喝。

新的一年,希望公主号中各个厂的小伙伴,福利都能再上一个档次。

对此,你怎么看?你收到过什么"特别红包"吗?欢迎评论区交流。

...

回归主题。

来一道和「字节跳动」相关的算法题。

题目描述

平台:LeetCode

题号:780

给定四个整数 sxsytx 和 ty,如果通过一系列的转换可以从起点 (sx,sy)(sx, sy) 到达终点 (tx,ty)(tx, ty),则返回 true,否则返回 false

从点 (x,y)(x, y) 可以转换到 (x,x+y)(x, x+y)  或者 (x+y,y)(x+y, y)

示例 1:

输入: sx = 1, sy = 1, tx = 3, ty = 5

输出: true

解释:
可以通过以下一系列转换从起点转换到终点:
(1, 1) -> (1, 2)
(1, 2) -> (3, 2)
(3, 2) -> (3, 5)

示例 2:

输入: sx = 1, sy = 1, tx = 2, ty = 2 

输出: false

示例 3:

输入: sx = 1, sy = 1, tx = 1, ty = 1 

输出: true

提示:

  • 1<=sx,sy,tx,ty<=1091 <= sx, sy, tx, ty <= 10^9

数学

给定的 (sx,sy)(sx, sy) 的数据范围为 [1,109][1, 10^9](即均为正整数),且每次转换,只能将另外一维的数值累加到当前维,因此对于每一维的数值而言,随着转换次数的进行,呈(非严格)递增趋势,再结合起始值为正整数,可知在转换过程中均不会出现负数。

由此得知从 (tx,ty)(tx, ty)(sx,sy)(sx, sy) 的转换过程唯一确定:总是取较大数减去较小数来进行反推(否则会出现负数)。

但即使反向转换唯一确定,数据范围为 10910^9,线性模拟仍会超时。

我们考虑将「相同操作的连续段转换动作」进行合并,在某次反向转换中,如果有 tx<tytx < ty,我们会将 (tx,ty)(tx, ty) 转换为 (tx,tytx)(tx, ty - tx),若相减完仍有 tx<tytxtx < ty - tx,该操作会继续进行,得到 (tx,ty2×tx)(tx, ty - 2 \times tx),直到不满足 tx<tyk×txtx < ty - k \times tx,其中 kk 为转换次数。

即对于一般性的情况而言,(tx,ty)(tx, ty) 中的较大数会一直消减到「与较小数的余数」为止。

因此我们可以先使用 O(logmax(tx,ty))O(\log{max(tx, ty)}) 的复杂度将其消减到不超过 (sx,sy)(sx, sy) 为止。此时如果消减后的结果 (tx,ty)(tx, ty) 任一维度小于 (sx,sy)(sx, sy),必然不能进行转换,返回 False;如果任一维度相等(假定是 xx 维度),则检查另一维度(yy 维度)的差值,能够由当前维度(xx 维度)拼凑而来。

Java 代码:

class Solution {
    public boolean reachingPoints(int sx, int sy, int tx, int ty) {
        while (sx < tx && sy < ty) {
            if (tx < ty) ty %= tx;
            else tx %= ty;
        }
        if (tx < sx || ty < sy) return false;
        return sx == tx ? (ty - sy) % tx == 0 : (tx - sx) % ty == 0;
    }
}

C++ 代码:

class Solution {
public:
    bool reachingPoints(int sx, int sy, int tx, int ty) {
        while (sx < tx && sy < ty) {
            if (tx < ty) ty %= tx;
            else tx %= ty;
        }
        if (tx < sx || ty < sy) return false;
        return sx == tx ? (ty - sy) % tx == 0 : (tx - sx) % ty == 0;
    }
};

Python 代码:

class Solution:
    def reachingPoints(self, sx: int, sy: int, tx: int, ty: int) -> bool:
        while sx < tx and sy < ty:
            if tx < ty:
                ty %= tx
            else:
                tx %= ty
        if tx < sx or ty < sy:
            return False
        return sx == tx and (ty - sy) % tx == 0 or (sx != tx and (tx - sx) % ty == 0)

TypeScript 代码:

function reachingPoints(sx: number, sy: number, tx: number, ty: number): boolean {
    while (sx < tx && sy < ty) {
        if (tx < ty) ty %= tx;
        else tx %= ty;
    }
    if (tx < sx || ty < sy) return false;
    return sx === tx ? (ty - sy) % tx === 0 : (tx - sx) % ty === 0; 
};
  • 时间复杂度:O(logmax(tx,ty))O(\log{\max(tx, ty)})
  • 空间复杂度:O(1)O(1)