最近在网上看到一个帖子,一位腾讯员工在腾讯工作了快7年,由于年后组织架构调整,意味着可能要裁员,加上赔偿,这7年在腾讯大概挣了900多万,还完房贷还剩500万,38岁打算回二线躺平了。
7年挣了900多万,在腾讯如果职级高的话也很容易实现,我们来看下腾讯不同职级的年薪范围:
4-5级(校招/初级工程师):平均月薪约18000元,这个级别主要面向应届毕业生。
6级(工程师):年薪总收入约40-70万元。
7-8级(高级工程师):7级8级年薪总收入约50-130万元。
9-10级(资深工程师/专家):9级年薪约80-120万元,10级年薪约100-160万元。从10级开始,员工通常能够获得股票期权,这是薪酬结构中重要的组成部分。
11-12级(高级专家):11级年薪约120-200万元,12级年薪约200-300万元。这些级别已经属于技术专家,在团队中承担核心架构设计和重大技术决策的职责。
13-14级(总监及以上):13级年薪约200-300万元,14级年薪可达300万元以上。这个级别通常担任技术总监或部门负责人,管理整个技术团队。
![]()
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第593题:有效的正方形,难度是中等。
给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true 。点的坐标 pi 表示为 [xi, yi] 。 输入没有任何顺序 。一个有效的正方形 有四条等边和四个等角(90度角)。
示例1:
输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1] 输出: true
示例2:
输入:p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,12] 输出:false
p1.length == p2.length == p3.length == p4.length == 2
-10^4 <= xi, yi <= 10^4
问题分析
这题说的是给出4个顶点,判断是否是正方形。我们知道正方形的4条边的长度都是相等的,我们可以计算这4个顶点两两之间的距离,如果有4个值相等,也就意味着有4条边是相等的,那么它一定是菱形。如果还有两个值是相等的,并且它的值比4条边的值还要大,就可以确定它是一个正方形了。
所以这题的判断逻辑就是先判断是菱形,然后再判断是否是正方形。因为题中的p值都不是很大,所以我们计算两点之间距离的时候,可以不用开方。
JAVA:
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
int[] distances = newint[]{// 计算两两之间距离的平方
sq(p1, p2), sq(p1, p3),
sq(p1, p4), sq(p2, p3),
sq(p2, p4), sq(p3, p4)};
// num1和num2一个是直角边,一个是斜边。
int num1 = distances[0], cnt1 = 0;
int num2 = -1;
for (int dis : distances) {
if (dis == num1)
cnt1++;
elseif (num2 == -1 || dis == num2)
num2 = dis;
else// 其他情况,返回false
returnfalse;
}
// 如果num1是直角边,则数量必须是4,且长度小于num2。如果num1是斜边,则数量必须是2,且长度大于num2。
return cnt1 == 4 && num1 < num2 || cnt1 == 2 && num1 > num2;
}// 两点距离的平方
private int sq(int[] p1, int[] p2) {
return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
}
C++:
private:
// 两点距离的平方
int sq(vector &p1, vector &p2) {
return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
}public:
bool validSquare(vector &p1, vector &p2, vector &p3, vector &p4) {
// 计算两两之间距离的平方
vector distances = {
sq(p1, p2), sq(p1, p3),
sq(p1, p4), sq(p2, p3),
sq(p2, p4), sq(p3, p4)
};
// num1和num2一个是直角边,一个是斜边
int num1 = distances[0], cnt1 = 0;
int num2 = -1;
for (int dis: distances) {
if (dis == num1) {
cnt1++;
} elseif (num2 == -1 || dis == num2) {
num2 = dis;
} else {// 其他情况,返回false
returnfalse;
}
}
// 如果num1是直角边,则数量必须是4,且长度小于num2
// 如果num1是斜边,则数量必须是2,且长度大于num2
return (cnt1 == 4 && num1 < num2) || (cnt1 == 2 && num1 > num2);
}
笔者简介
博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解900多题,对算法题有自己独特的解题思路和解题技巧。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.