近期网络流传一份关于互联网大厂工作强度的梯队划分,引发广泛讨论。其中,拼多多(PDD)被列为第一梯队,工作强度居首,素有“多多一年,人间十年”之说。其“本分文化”与极致效率要求,使其长期被视为“卷王”代表。尽管工作节奏紧张,但招聘平台数据显示,PDD提供的薪资水平也相对较高。
第二梯队:高强度竞争格局
得物、小红书、京东、字节跳动位列第二梯队,整体工作强度依然较大。其中,字节跳动因面试算法题难度普遍为LeetCode Hard级别,被网友戏称为“宇宙条”,竞争压力可见一斑。
第三梯队:相对均衡的工作节奏
快手、阿里、腾讯、百度、美团等企业归为第三梯队,整体工作强度相较前两梯队略低。这些企业在部门内部的薪资差距不如拼多多、小红书等公司显著,整体管理风格趋于稳定。
--------------以下是今日算法题--------------
LeetCode第1546题:和为目标值且不重叠的非空子数组的最大数目
难度:中等
给定一个整数数组 nums 和目标值 target,返回非空不重叠子数组的最大数目,且每个子数组的元素和均等于 target。
示例1:
输入:nums = [1,1,1,1,1], target = 2
输出:2
解释:存在两个不重叠子数组 [1,1] 和 [1,1],和均为 2。
示例2:
输入:nums = [-1,3,5,1,4,2,-9], target = 6
输出:2
解释:和为 6 的子数组有 [5,1]、[4,2]、[3,5,1,4,2,-9],但仅有前两个不重叠。
- 1 <= nums.length <= 10^5
- -10^4 <= nums[i] <= 10^4
- 0 <= target <= 10^6
解题思路
本题需找出最多互不重叠的子数组数量,且每段子数组和为 target。由于数组可能包含负数,滑动窗口不适用,应采用前缀和结合哈希表的方法。
遍历过程中,利用前缀和判断是否存在子数组和为 target,并记录该子数组结束位置。为保证不重叠,下一个有效子数组的起始位置必须大于上一个子数组的结束位置。
代码中使用 map 记录前缀和及其对应索引,当 preSum - target 存在于 map 中,且其对应索引(即子数组起始前一位)大于等于上一个子数组的结束位置时,计数加一并更新结束位置。
JAVA 实现
public int maxNonOverlapping(int[] nums, int target) {
int ans = 0, last = -1, preSum = 0;
Map<Integer, Integer> mp = new HashMap<>();
mp.put(0, -1);
for (int i = 0; i < nums.length; i++) {
preSum += nums[i];
Integer start = mp.get(preSum - target);
if (start != null && start >= last) {
ans++;
last = i;
}
mp.put(preSum, i);
}
return ans;
}
C++ 实现
int maxNonOverlapping(vector<int> &nums, int target) {
int ans = 0, last = -1, preSum = 0;
unordered_map<int, int> mp;
mp[0] = -1;
for (int i = 0; i < nums.size(); i++) {
preSum += nums[i];
auto it = mp.find(preSum - target);
if (it != mp.end() && it->second >= last) {
++ans;
last = i;
}
mp[preSum] = i;
}
return ans;
}

