应届毕业大厂薪资
最近,著名爆料社区「脉脉」传来了《应届毕业生の大厂薪资地图》。
信息很多,我们逐一分析。
首先,有无"签字费"(可以视为入职奖金,只有首年有)的公司比例,基本是五五开。虽然签字费的有无,更多是因人而异(更关键在于谈判技巧),但综合来看,鹅厂和宇宙厂在签字费上是最舍得的。
至于股票/期权,只有鹅厂和宇宙厂会有。其中鹅厂因为是上市公司,所以是实打实的股票,而宇宙厂只是期权,但根据这两年的回购价格走势变化,以及归属加快机制来看,同价值的股票期权,长远来看,宇宙厂的会更加值钱一些。
然后是应届毕业很看重的"房补",这部分福利,福报厂以"每月 3200"断层式领先。紧随其后的,是老铁厂的"每月 2000";宇宙厂则是"每月 1500";鹅厂的话,根据最新规则,将这部分的福利纳入到了月 base 当中;至于某壳的"仅首月 2500",只能说总比没有的好 🤣🤣
最后是「月薪 base」和「年终奖月薪数量」,在这项数据里,有两家公司几乎不分上下。
其一,是过去一年,各种高调宣布涨薪的 狗厂,因为 19 薪,开发岗的年薪(现金部分)可以达到 45W~57W,算法岗可以达到 57W~66W。
其二,是被誉为"血汗厂"的 某多多,因 18 薪的高年终,技术岗的年薪(现金部分)达到了 57W~72W。
好家伙,这可是毕业应届生呀 🤣🤣🤣
综合现金和各项福利待遇来看,某多多虽然有轻微优势,但因为其入职会签署离谱的"竞业协议"(几乎涵盖了绝大多数的互联网公司),我并不推荐应届毕业生优先选择某多多。
狗厂虽然过去一年,不断在强调"涨薪"和"涨年终"的改革,但由于新规则建立不久,目前还不能完全确定,是否人均就能拿到这个月数的年终奖,以及涨收入背后需要付出的代价是什么。
相反,我更加推荐大家优先考虑一些,在过去几年福利待遇都很稳定的老牌大厂,例如"宇宙厂"和"鹅厂。这两家公司,也是榜单中营收和利润 TOP 2 的公司。
...
回归主题。
周末,来一道简单的「校招」相关算法题。
题目描述
平台:LeetCode
题号:468
给定一个字符串 queryIP
。如果是有效的 IPv4
地址,返回 "IPv4"
;如果是有效的 IPv6
地址,返回 "IPv6"
;如果不是上述类型的 IP
地址,返回 "Neither"
。
有效的 IPv4
地址 是 “x1.x2.x3.x4”
形式的 IP
地址。 其中 且 不能包含 前导零。
例如: “192.168.1.1”
、 “192.168.1.0”
为有效 IPv4
地址, “192.168.01.1”
为无效 IPv4
地址; “192.168.1.00”
、 “192.168@1.1”
为无效 IPv4
地址。
一个有效的 IPv6
地址 是一个格式为 “x1:x2:x3:x4:x5:x6:x7:x8”
的 IP
地址,其中:
是一个 十六进制字符串 ,可以包含数字、小写英文字母( 'a'
到'f'
)和大写英文字母('A'
到'F'
)。在 中允许前导零。
例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
和 "2001:db8:85a3:0:0:8A2E:0370:7334"
是有效的 IPv6
地址,而 "2001:0db8:85a3::8A2E:037j:7334"
和 "02001:0db8:85a3:0000:0000:8a2e:0370:7334"
是无效的 IPv6
地址。
示例 1:
输入:queryIP = "172.16.254.1"
输出:"IPv4"
解释:有效的 IPv4 地址,返回 "IPv4"
示例 2:
输入:queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出:"IPv6"
解释:有效的 IPv6 地址,返回 "IPv6"
示例 3:
输入:queryIP = "256.256.256.256"
输出:"Neither"
解释:既不是 IPv4 地址,又不是 IPv6 地址
提示:
queryIP
仅由英文字母,数字,字符'.'
和':'
组成。
模拟
为了方便,我们称合法 IPv4
/IPv6
中由 .
/:
分割的部分称为 item
。
无论是 IPv4
还是 IPv6
,我们都只需将连续段的 item
取出,并结合题意判断即可,一个较为简单的方式使用 split
操作来得到所有的 item
,考虑到某些语言并不内置 split
,这里采取双指针的方式来做。
为方便大家理解,今天将题解文字说明写到注释中。
Java 代码:
class Solution {
public String validIPAddress(String ip) {
if (ip.indexOf(".") >= 0 && check4(ip)) return "IPv4";
if (ip.indexOf(":") >= 0 && check6(ip)) return "IPv6";
return "Neither";
}
boolean check4(String ip) {
int n = ip.length(), cnt = 0;
char[] cs = ip.toCharArray();
for (int i = 0; i < n && cnt <= 3; ) {
// 找到连续数字段,以 x 存取
int j = i, x = 0;
while (j < n && cs[j] >= '0' && cs[j] <= '9' && x <= 255) x = x * 10 + (cs[j++] - '0');
// 非 item 字符之间没有 item
if (i == j) return false;
// 含前导零 或 数值大于 255
if ((j - i > 1 && cs[i] == '0') || (x > 255)) return false;
i = j + 1;
if (j == n) continue;
// 存在除 . 以外的其他非数字字符
if (cs[j] != '.') return false;
cnt++;
}
// 恰好存在 3 个不位于两端的 .
return cnt == 3 && cs[0] != '.' && cs[n - 1] != '.';
}
boolean check6(String ip) {
int n = ip.length(), cnt = 0;
char[] cs = ip.toCharArray();
for (int i = 0; i < n && cnt <= 7; ) {
int j = i;
while (j < n && ((cs[j] >= 'a' && cs[j] <= 'f') || (cs[j] >= 'A' && cs[j] <= 'F') || (cs[j] >= '0' && cs[j] <= '9'))) j++;
// 非 item 字符之间没有 item 或 长度超过 4
if (i == j || j - i > 4) return false;
i = j + 1;
if (j == n) continue;
// 存在除 : 以外的其他非数字字符
if (cs[j] != ':') return false;
cnt++;
}
// 恰好存在 7 个不位于两段的 :
return cnt == 7 && cs[0] != ':' && cs[n - 1] != ':';
}
}
C++ 代码:
class Solution {
public:
string validIPAddress(string ip) {
if (ip.find('.') != string::npos && check4(ip)) return "IPv4";
if (ip.find(':') != string::npos && check6(ip)) return "IPv6";
return "Neither";
}
bool check4(string ip) {
int n = ip.length(), cnt = 0;
for (int i = 0; i < n && cnt <= 3; ) {
int j = i, x = 0;
while (j < n && isdigit(ip[j]) && x <= 255) x = x * 10 + (ip[j++] - '0');
if (i == j) return false;
if ((j - i > 1 && ip[i] == '0') || x > 255) return false;
i = j + 1;
if (j == n) continue;
if (ip[j] != '.') return false;
cnt++;
}
return cnt == 3 && ip[0] != '.' && ip[n - 1] != '.';
}
bool check6(string ip) {
int n = ip.length(), cnt = 0;
for (int i = 0; i < n && cnt <= 7; ) {
int j = i;
while (j < n && (isxdigit(ip[j]) || isdigit(ip[j]))) j++;
if (i == j || j - i > 4) return false;
i = j + 1;
if (j == n) continue;
if (ip[j] != ':') return false;
cnt++;
}
return cnt == 7 && ip[0] != ':' && ip[n - 1] != ':';
}
};
Python 代码:
class Solution:
def validIPAddress(self, ip: str) -> str:
if '.' in ip and self.check4(ip):
return "IPv4"
if ':' in ip and self.check6(ip):
return "IPv6"
return "Neither"
def check4(self, ip: str) -> bool:
n, cnt, i = len(ip), 0, 0
while i < n and cnt <= 3:
j, x = i, 0
while j < n and '0' <= ip[j] <= '9' and x <= 255:
x = x * 10 + (ord(ip[j]) - ord('0'))
j += 1
if i == j:
return False
if (j - i > 1 and ip[i] == '0') or x > 255:
return False
i = j + 1
if j == n:
continue
if ip[j] != '.':
return False
cnt += 1
return cnt == 3 and ip[0] != '.' and ip[n - 1] != '.'
def check6(self, ip: str) -> bool:
n, cnt, i = len(ip), 0, 0
while i < n and cnt <= 7:
j = i
while j < n and ('a' <= ip[j] <= 'f' or 'A' <= ip[j] <= 'F' or '0' <= ip[j] <= '9'):
j += 1
if i == j or j - i > 4:
return False
i = j + 1
if j == n:
continue
if ip[j] != ':':
return False
cnt += 1
return cnt == 7 and ip[0] != ':' and ip[n - 1] != ':'
TypeScript 代码:
function validIPAddress(ip: string): string {
if (ip.includes('.') && check4(ip)) return "IPv4";
if (ip.includes(':') && check6(ip)) return "IPv6";
return "Neither";
};
function check4(ip: string): boolean {
const n = ip.length;
let cnt = 0;
for (let i = 0; i < n && cnt <= 3; ) {
let j = i, x = 0;
while (j < n && '0' <= ip[j] && ip[j] <= '9' && x <= 255) {
x = x * 10 + (ip.charCodeAt(j) - '0'.charCodeAt(0));
j++;
}
if (i === j || (j - i > 1 && ip[i] === '0') || x > 255) return false;
i = j + 1;
if (j === n) continue;
if (ip[j] !== '.') return false;
cnt++;
}
return cnt === 3 && ip[0] !== '.' && ip[n - 1] !== '.';
}
function check6(ip: string): boolean {
const n = ip.length;
let cnt = 0;
for (let i = 0; i < n && cnt <= 7; ) {
let j = i;
while (j < n && ('a' <= ip[j] && ip[j] <= 'f' || 'A' <= ip[j] && ip[j] <= 'F' || '0' <= ip[j] && ip[j] <= '9')) {
j++;
}
if (i === j || j - i > 4) return false;
i = j + 1;
if (j === n) continue;
if (ip[j] !== ':') return false;
cnt++;
}
return cnt === 7 && ip[0] !== ':' && ip[n - 1] !== ':';
}
时间复杂度: 空间复杂度:使用 toCharArray
操作会产生新数组,复杂度为 ,使用charAt
操作代替复杂度为
最后
巨划算的 LeetCode 会员优惠通道目前仍可用 ~
使用福利优惠通道 leetcode.cn/premium/?promoChannel=acoier,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。