特别红包
刚刚,美团宣布发放春节特别红包,庆祝美团成立十五周年。
正式员工每人 588 元,实习生每人 188 元,以美团卡的形式发放(直接充进美团账号),既可以自己领取,也可以直接转赠亲友,金额可直接用于消费。
对美团员工来说,当然是好事儿,红包是越多越好,没人嫌少。
但这实打实的福利,也未能逃脱网友们的"毒舌"(网友们真的很严格):
一些带着其他大厂的职业认证标识的网友们,觉得这红包也忒小了。
尤其是未能躲过「字节跳动」小伙伴的嘲讽,毕竟这 588 只能排到字节春节红包中的倒数第二档 🤣🤣
字节春节红包的规格为「3688/1888/988/588/288」共 5 档,红包金额和司龄相对应,分别是「>3年/13年/612个月/3~6个月/<3个月 or 实习生」,但 2025 年将是最后发放的一年。
但要我说,美团的小伙伴不必在意,他笑他的,你领你的,这放糖的白开水,大可放心喝。
新的一年,希望公主号中各个厂的小伙伴,福利都能再上一个档次。
对此,你怎么看?你收到过什么"特别红包"吗?欢迎评论区交流。
...
回归主题。
来一道和「字节跳动」相关的算法题。
题目描述
平台:LeetCode
题号:780
给定四个整数 sx
,sy
,tx
和 ty
,如果通过一系列的转换可以从起点 到达终点 ,则返回 true
,否则返回 false
。
从点 可以转换到 或者 。
示例 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
提示:
数学
给定的 的数据范围为 (即均为正整数),且每次转换,只能将另外一维的数值累加到当前维,因此对于每一维的数值而言,随着转换次数的进行,呈(非严格)递增趋势,再结合起始值为正整数,可知在转换过程中均不会出现负数。
由此得知从 到 的转换过程唯一确定:总是取较大数减去较小数来进行反推(否则会出现负数)。
但即使反向转换唯一确定,数据范围为 ,线性模拟仍会超时。
我们考虑将「相同操作的连续段转换动作」进行合并,在某次反向转换中,如果有 ,我们会将 转换为 ,若相减完仍有 ,该操作会继续进行,得到 ,直到不满足 ,其中 为转换次数。
即对于一般性的情况而言, 中的较大数会一直消减到「与较小数的余数」为止。
因此我们可以先使用 的复杂度将其消减到不超过 为止。此时如果消减后的结果 任一维度小于 ,必然不能进行转换,返回 False
;如果任一维度相等(假定是 维度),则检查另一维度( 维度)的差值,能够由当前维度( 维度)拼凑而来。
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;
};
- 时间复杂度:
- 空间复杂度: