京东立新规
近日,网传京东从本周起开始执行新规。
午休时间从以前的 11:30~13:30 调整为 12:00~13:00,原定 2 个小时的午休时间被压缩至一半。
不仅如此,新规还指出:每天早上 9 点,统计工位上的人数;晚上准点(6 点)下班的员工,需要其上级考虑其工作饱和度;非工作性质的微信群统统解散,要求员工沟通只能使用咚咚进行。
如此"激进"的改革自然引起不少热议,有网友猜测,是 PDD 的 HR 跳了过去,搞起了友商的策略:
而更多的吃瓜网友则伸出"援手":
表示欢迎京东同学加入,午休管够,早八晚五,就是薪资可能要降 30% 🤣🤣🤣
当然,这位网友是有点开玩笑的意思,但来自「华为」的同学则真诚表示,自己的午休是真的管够:
午休不但从 11:45 到 14:10,而且都是拉窗帘关灯的,午休时间长到「睡醒了又睡」的地步 🤣🤣🤣
...
回归主线。
来一道和「华为 OD」相关的题目。
题目描述
平台:LeetCode
题号:1652
你有一个炸弹需要拆除,时间紧迫!
你的情报员会给你一个长度为 n
的 循环 数组 code
以及一个密钥 k
。
为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。
-
如果 ,将第 i
个数字用 接下来k
个数字之和替换。 -
如果 ,将第 i
个数字用 之前k
个数字之和替换。 -
如果 ,将第 i
个数字用0
替换。
由于 code
是循环的, code[n-1]
下一个元素是 code[0]
,且 code[0]
前一个元素是 code[n-1]
。
给你 循环 数组 code
和整数密钥 k
,请你返回解密后的结果来拆除炸弹!
示例 1:
输入:code = [5,7,1,4], k = 3
输出:[12,10,16,13]
解释:每个数字都被接下来 3 个数字之和替换。解密后的密码为 [7+1+4, 1+4+5, 4+5+7, 5+7+1]。注意到数组是循环连接的。
示例 2:
输入:code = [1,2,3,4], k = 0
输出:[0,0,0,0]
解释:当 k 为 0 时,所有数字都被 0 替换。
示例 3:
输入:code = [2,4,9,3], k = -2
输出:[12,5,6,13]
解释:解密后的密码为 [3+9, 2+3, 4+2, 9+4] 。注意到数组是循环连接的。如果 k 是负数,那么和为 之前 的数字。
提示:
前缀和
根据题意 code
为循环数组,我们可以建立一个长度为
的前缀和数组(为了方便,我们令前缀和数组下标从
开始),利用前缀和数组来构建答案。
对于每一位
而言(其中
的取值范围为
),我们根据 k
值的正负情况来决定取自前缀和数组中的哪一段:
-
若有 :需要取位置 前的 个数,为防止下越界标,先将位置 往后进行 个偏移(即位置 ),随后可知对应区间 ,对应区间和为
-
若有 :需要取位置 后的 个数,对应前缀和数组下标 ,对应区间和为
Java 代码:
class Solution {
public int[] decrypt(int[] code, int k) {
int n = code.length;
int[] ans = new int[n];
if (k == 0) return ans;
int[] sum = new int[n * 2 + 10];
for (int i = 1; i <= 2 * n; i++) sum[i] += sum[i - 1] + code[(i - 1) % n];
for (int i = 1; i <= n; i++) {
if (k < 0) ans[i - 1] = sum[i + n - 1] - sum[i + n + k - 1];
else ans[i - 1] = sum[i + k] - sum[i];
}
return ans;
}
}
C++ 代码:
class Solution {
public:
vector<int> decrypt(vector<int>& code, int k) {
int n = code.size();
vector<int> ans(n);
if (k == 0) return ans;
vector<long long> sum((n + 1) * 2, 0);
for (int i = 1; i <= 2 * n; ++i) sum[i] = sum[i - 1] + code[(i - 1) % n];
for (int i = 1; i <= n; ++i) {
if (k < 0) ans[i - 1] = sum[i + n - 1] - sum[i + n + k - 1];
else ans[i - 1] = sum[i + k] - sum[i];
}
return ans;
}
};
Python 代码:
class Solution:
def decrypt(self, code: List[int], k: int) -> List[int]:
n = len(code)
ans = [0] * n
if k == 0:
return ans
sum = [0] * (2 * n + 10)
for i in range(1, 2 * n + 1):
sum[i] = sum[i - 1] + code[(i - 1) % n]
for i in range(1, n + 1):
if k < 0:
ans[i - 1] = sum[i + n - 1] - sum[i + n + k - 1]
else:
ans[i - 1] = sum[i + k] - sum[i]
return ans
TypeScript 代码:
function decrypt(code: number[], k: number): number[] {
const n = code.length
const ans = new Array<number>(n).fill(0)
if (k == 0) return ans
const sum = new Array<number>(2 * n + 10).fill(0)
for (let i = 1; i <= 2 * n; i++) sum[i] = sum[i - 1] + code[(i - 1) % n]
for (let i = 1; i <= n; i++) {
if (k < 0) ans[i - 1] = sum[i + n - 1] - sum[i + n + k - 1]
else ans[i - 1] = sum[i + k] - sum[i]
}
return ans
};
-
时间复杂度: -
空间复杂度:
最后
给大伙通知一下 📢 :
全网最低价 LeetCode 会员目前仍可用 ~
📅 年度会员:有效期加赠两个月!!; 季度会员:有效期加赠两周!!
🧧 年度会员:获 66.66 现金红包!!; 季度会员:获 22.22 现金红包!!
🎁 年度会员:参与当月丰厚专属实物抽奖(中奖率 > 30%)!!
专属链接:leetcode.cn/premium/?promoChannel=acoier
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉