最新应届毕业生大厂薪资地图

教育   2025-01-05 15:15   广东  

应届毕业大厂薪资

最近,著名爆料社区「脉脉」传来了《应届毕业生の大厂薪资地图》。

信息很多,我们逐一分析。

首先,有无"签字费"(可以视为入职奖金,只有首年有)的公司比例,基本是五五开。虽然签字费的有无,更多是因人而异(更关键在于谈判技巧),但综合来看,鹅厂和宇宙厂在签字费上是最舍得的。

至于股票/期权,只有鹅厂和宇宙厂会有。其中鹅厂因为是上市公司,所以是实打实的股票,而宇宙厂只是期权,但根据这两年的回购价格走势变化,以及归属加快机制来看,同价值的股票期权,长远来看,宇宙厂的会更加值钱一些。

然后是应届毕业很看重的"房补",这部分福利,福报厂以"每月 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 > 4return 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 > 255return 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 > 4return 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), 00
        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), 00
        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 > 255return 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 > 4return 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,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。

我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻

欢迎关注,明天见。



宫水三叶的刷题日记
锐评时事热点的 算法与数据结构 题解区博主。「 刷穿 LeetCode 」系列文章原创公众号。
 最新文章