大家好,我是苍何呀。
从脉脉那里要到了一份最新大厂薪资地图,趁着还热乎,赶紧给大家做个分享。
我们先来看看大厂大头兵研发岗薪资情况吧,看看在大厂做研发究竟能拿到多少钱。
不难看出,大厂动不动就是 15 薪,16 薪,也就是干 12 个月能拿 15 个月的钱,这真是很好的待遇。
一些知名大厂(如福报厂、鹅厂、熊厂等)的薪资水平普遍较高,基本的 base 也很高,而且随着工作年限增加,薪资也成倍增加。
比如,福报厂在 1-3 年工作经验的月薪区间为 10-20k,而在 10 年以上工作经验的月薪区间则高达 100k 以上。
当然最为关键的还有年终奖,这一笔收入可不小,也是大家辛勤工作了一年的回报,临近过年,很多公司的年终奖已经公布了。
当然大家如果想看各个公司的年终奖也可以扫描图片中的二维码自行查看。不看不知道,有些公司的年终奖是真的高啊。
如果恰巧你公司也公布了年终奖,可以在里面爆料给大家羡慕羡慕(手动狗头),也让大家更有激情冲刺大厂。
我们再来看看应届生在大厂能拿多少薪资吧,其中很多苍何之前的文章中都也给大家做过分享。
这下,你能明白为什么一堆毕业生挤破了头皮也要冲大厂了吧?星球里很多同学也拿到了比较好的结果。
现在面试大厂越来越难了,除了基本的八股,还需有几个亮点的项目,否则连面试机会可能都没有。
除了研发和应届薪资,还看了产品岗和运营岗,也是相当的给力。
能够看出,除了研发,产品和运营岗在大厂薪资也是相当高的。
好啦,新的一年希望大家都能取得一个不错的结果,冲刺大厂的同学都能顺利拿到 offer。另外关于大厂薪资,你有什么补充的呢?欢迎评论区讨论。
…
回归主题。
今天来一道某大厂开发考过的一道面试算法题,给枯燥的牛马生活加加油😂。
题目描述
平台:LeetCode
题号:15
题目名称:三数之和
给你一个整数数组 nums
,判断是否存在三个元素 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为 0
且不重复的三元组。
**注意:**答案中不可包含重复的三元组。
示例 1:
输入:
nums = [-1, 0, 1, 2, -1, -4]
输出:
[[-1, -1, 2], [-1, 0, 1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0
不同的三元组是 [-1, 0, 1]
和 [-1, -1, 2]
。
**注意:**输出的顺序和三元组的顺序不重要。
示例 2:
输入:
nums = [0, 1, 1]
输出:
[]
解释: 没有满足条件的三元组。
示例 3:
输入:
nums = [0, 0, 0]
输出:
[[0, 0, 0]]
解释: 唯一可能的三元组和为 0
。
提示:
3 <= nums.length <= 3000
-10⁵ <= nums[i] <= 10⁵
解题思路
总体思路:
- 排序数组:首先对数组
nums
进行排序,这样可以方便去重和使用双指针。 - 遍历数组:用一个指针
i
遍历数组,从第一个数到倒数第三个数。
- 如果当前数
nums[i]
大于0
,直接退出循环(因为数组已经排序,后面的数都大于0
,不可能出现和为0
)。 - 如果当前数与前一个数相同,跳过(为了去重)。
- 双指针查找:对于当前指针
i
,使用左右两个指针left
和right
在i
后面的子数组中查找和为0
的组合:
- 如果
nums[i] + nums[left] + nums[right] == 0
,记录下当前三元组,并移动左右指针跳过重复元素。 - 如果和小于
0
,移动左指针以增大和。 - 如果和大于
0
,移动右指针以减小和。
算法复杂度:
- 排序的时间复杂度为 O(nlogn)O(n \log n)。
- 遍历和双指针的时间复杂度为 O(n2)O(n^2)。
- 总体时间复杂度为 O(n2)O(n^2)。
代码实现
Java代码:
import java.util.*;
public class ThreeSum {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums); // 对数组进行排序
int n = nums.length;
for (int i = 0; i < n - 2; i++) {
// 跳过重复的数
if (i > 0 && nums[i] == nums[i - 1]) continue;
int left = i + 1;
int right = n - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
left++;
right--;
// 跳过重复的左指针值
while (left < right && nums[left] == nums[left - 1]) left++;
// 跳过重复的右指针值
while (left < right && nums[right] == nums[right + 1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
}
C++代码:
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end()); // 对数组进行排序
int n = nums.size();
for (int i = 0; i < n - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue; // 跳过重复的数
int left = i + 1, right = n - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
result.push_back({nums[i], nums[left], nums[right]});
left++;
right--;
// 跳过重复的左指针值
while (left < right && nums[left] == nums[left - 1]) left++;
// 跳过重复的右指针值
while (left < right && nums[right] == nums[right + 1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
};
Python代码:
from typing import List
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort() # 对数组进行排序
result = []
n = len(nums)
for i in range(n - 2):
if i > 0 and nums[i] == nums[i - 1]: # 跳过重复的数
continue
left, right = i + 1, n - 1
while left < right:
total = nums[i] + nums[left] + nums[right]
if total == 0:
result.append([nums[i], nums[left], nums[right]])
left += 1
right -= 1
# 跳过重复的左指针值
while left < right and nums[left] == nums[left - 1]:
left += 1
# 跳过重复的右指针值
while left < right and nums[right] == nums[right + 1]:
right -= 1
elif total < 0:
left += 1
else:
right -= 1
return result
复杂度分析
- 时间复杂度: O(n2)O(n^2),排序 O(nlogn)O(n \log n) + 遍历和双指针 O(n2)O(n^2)。
- 空间复杂度: O(1)O(1),只需要常数额外空间(输出不计入)。