网友:硕士5年了,税前才70w,感觉自己很失败。
最近在网上看到这样一个评论,一网友说自己硕士毕业5年了,税前才70w,感觉自己很失败。
他的职位是后端开发,税前是70w,我们按照一年13到18薪来计算,当然能发到18薪是少数。按照这个区间来算的话,月薪大概在3.8w-5.38w之间。
硕士毕业5年的薪资不好查,在OfferShow上看下一个硕士校招的薪资,这里只统计后端开发,每个公司给到的薪资都不一样,也有一些可以给到30k的。毕业5年就算工资翻一倍,年薪也是能达到70w的。
不过对于这位网友的言论,大多数人持有的是负面评论,我们可以看下。
看完了薪资我们来看一道谷歌的面试题,这题是LeetCode的第447题:回旋镖的数量,一网友在谷歌面试的时候遇到这题,我们来看下。
问题描述
来源:LeetCode第447题
难度:中等
给定平面上 n 对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。
返回平面上所有回旋镖的数量。
示例1:
输入:points = [[0,0],[1,0],[2,0]]
输出:2
解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
示例2:
输入:points = [[1,1],[2,2],[3,3]]
输出:2
n == points.length
1 <= n <= 500
points[i].length == 2
-10^4 <= xi, yi <= 10^4
所有点都 互不相同
问题分析
这题是让计算回旋镖的数量,回旋镖的形状如下,他有一个顶点,我们以当前顶点为起始点,计算当前顶点到其他所有点的距离。
假如到当前顶点距离为m的有n条边,这n条边随便选择两条即可构成回旋镖,那么这n条边构成总的回旋镖(必须以当前点为顶点)数量为n*(n-1),如果还有其他距离相同的边也可以构成回旋镖,只需要累加即可计算以当前点为顶点所构成的回旋镖的数量。
如果要计算所有回旋镖的数量,我们需要以每一个点为顶点都计算一遍即可,代码如下。
JAVA:
public int numberOfBoomerangs(int[][] points) {
int res = 0;
Map<Integer, Integer> map = new HashMap<>();
for (int[] point1 : points) {// 以其中一个点为起始点,计算到其他所有点的距离。
for (int[] point2 : points) {
int dis = (point1[0] - point2[0]) * (point1[0] - point2[0])
+ (point1[1] - point2[1]) * (point1[1] - point2[1]);
map.put(dis, map.getOrDefault(dis, 0) + 1);
}
// 假如到当前点距离为m的有n条边,那么这n条边随便选择两条都可以构成回旋镖,
// 所以组合的数量是n*(n-1),这里只需要累加即可。
for (int val : map.values())
res += val * (val - 1);
map.clear();// 这里要清空,下一步以下一个点为起始点计算。
}
return res;
}
C++:
public:
int numberOfBoomerangs(vector<vector<int>>& points) {
int res = 0;
unordered_map<int, int> map;
for (auto &point1 : points) {// 以其中一个点为起始点,计算到其他所有点的距离。
for (auto &point2 : points) {
int dis = (point1[0] - point2[0]) * (point1[0] - point2[0])
+ (point1[1] - point2[1]) * (point1[1] - point2[1]);
map[dis]++;
}
// 假如到当前点距离为m的有n条边,那么这n条边随便选择两条都可以构成回旋镖,
// 所以组合的数量是n*(n-1),这里只需要累加即可。
for (const auto& kv : map)
res += kv.second * (kv.second - 1);
map.clear();// 这里要清空,下一步以下一个点为起始点计算。
}
return res;
}
Python:
def numberOfBoomerangs(self, points: List[List[int]]) -> int:
res = 0
for point1 in points:# 以其中一个点为起始点,计算到其他所有点的距离。
cnt = Counter()
for point2 in points:
dis = dist(point1, point2)
cnt[dis] += 1
for val in cnt.values():
res += val * (val - 1)
return res
C:
int distance(int* a, int* b) {
return (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);
}
typedef struct {
int key;
int val;
UT_hash_handle hh;
} hashTable;
hashTable* hashtable;
hashTable* find(int ikey) {
hashTable* tmp;
HASH_FIND_INT(hashtable, &ikey, tmp);
return tmp;
}
void insert(int ikey) {
hashTable* it = find(ikey);
if (it == NULL) {
hashTable* tmp = malloc(sizeof(hashTable));
tmp->key = ikey, tmp->val = 1;
HASH_ADD_INT(hashtable, key, tmp);
} else {
it->val++;
}
}
int numberOfBoomerangs(int **points, int pointsSize, int* pointsColSize) {
int res = 0;
for(int i = 0; i < pointsSize; i++) {
for(int j = 0; j < pointsSize; j++) {
int dis = distance(points[i],points[j]);
insert(dis);
}
hashTable *curr = NULL, *tmp = NULL;
HASH_ITER(hh, hashtable, curr, tmp) {
hashTable* pEntry = find(curr->key);
res += pEntry->val * (pEntry->val - 1);
HASH_DEL(hashtable, curr);
free(curr);
}
}
return res;
}
-------------------------end-------------------------
笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解700多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。