年终奖,还得是腾讯(含面试算法原题)

大家好,我是宝哥

今天吃个瓜,看看腾讯的年终奖是多少?


什么是真正的好公司?

一年到头,出不了几次裁员等劳务纠纷的吃瓜新闻。

只有到年底了,才因为年终奖远高于行业水平,实在没法低调了,"被迫"上热搜。

最近网友爆料了腾讯头牌部门的年终奖:

WXG(微信事业群):

  • 第一档:30 个月(视频号 - 优秀)

  • 第二档:20 个月(视频号 - 一般)

  • 第三档:16 个月(WXG - 一般)

  • 其它:不足 10 个月(WXG - 垫底水平)

IEG(互动娱乐事业群:天美工作室 and 光子工作室 and 其他):

  • 第一档:25 个月(元梦之星、王者荣耀 - 优秀)

  • 第二档:15 个月(元梦之星、王者荣耀 - 一般)

  • 第三档:9 个月(天美工作室 - 优秀)

  • 第四档:5 个月(光子工作室 - 一般)

  • 其它:3 - 4 个月(IEG - 垫底水平)

上述数据都是来自网友爆料,真实性不能保证。

但即使是真的,其实也不能真实反映腾讯整体年终奖水平。

毕竟 WXG 和 IEG 可是腾讯绝对的头牌事业群,年终奖肯定是要远高于中位数的。

当然,头不头牌的其实也不影响大家 🍋🍋:

a5102538b371cf5ffef1ab1137eb79c0.jpeg

15 个月的八折,12 个月,就是没有年终奖。

这年头上个网,没有年终奖可以,但没有幽默感可不行。

真正让我感到震惊的,是这条网友评论:

b5e08eee28711f317d24ff621acda6fb.jpeg

腾讯年终奖,我已经分不清他们到底是不是在凡尔赛了。

一位腾讯在职的网友留言:"年终奖只有 4.5 个月,要润么?"

这是真诚发问呢,还是在凡尔赛?

我怎么感觉,这位网友越是真诚发问,就越凡尔赛呢 😂

...

回归主线。

来一道稍有难度的「腾讯」面试算法题。

主要目的,是把大家「没去腾讯,太可惜了」的小思绪往下摁一摁。

题目描述

平台:LeetCode

题号:2305

给你一个整数数组 cs,其中 cs[i] 表示在第 i 个零食包中的饼干数量。

另给你一个整数 k 表示等待分发零食包的孩子数量,所有零食包都需要分发。

在同一个零食包中的所有饼干都必须分发给同一个孩子,不能分开。

分发的不公平程度定义为单个孩子在分发过程中能够获得饼干的最大总数。

返回所有分发的最小不公平程度。

示例 1:

输入:cs = [8,15,10,20,8], k = 2

输出:31

解释:一种最优方案是 [8,15,8] 和 [10,20] 。
- 第 1 个孩子分到 [8,15,8] ,总计 8 + 15 + 8 = 31 块饼干。
- 第 2 个孩子分到 [10,20] ,总计 10 + 20 = 30 块饼干。
分发的不公平程度为 max(31,30) = 31 。
可以证明不存在不公平程度小于 31 的分发方案。

示例 2:

输入:cs = [6,1,3,2,2,4,1,2], k = 3

输出:7

解释:一种最优方案是 [6,1]、[3,2,2] 和 [4,1,2] 。
- 第 1 个孩子分到 [6,1] ,总计 6 + 1 = 7 块饼干。 
- 第 2 个孩子分到 [3,2,2] ,总计 3 + 2 + 2 = 7 块饼干。
- 第 3 个孩子分到 [4,1,2] ,总计 4 + 1 + 2 = 7 块饼干。
分发的不公平程度为 max(7,7,7) = 7 。
可以证明不存在不公平程度小于 7 的分发方案。

提示:

  • 2<=cs.length<=82 <= cs.length <= 82<=cs.length<=8

  • 1<=cs[i]<=1051 <= cs[i] <= 10^51<=cs[i]<=105

  • 2<=k<=cs.length2 <= k <= cs.length2<=k<=cs.length

状压 DP

定义 f[i][s]f[i][s]f[i][s] 为考虑前 iii 个人,对 cs 的分配情况为 s 时的最小不公平程度。

其中 s 为一个二进制数,若 s 的第 i 位为 1 代表 cs[i] 已被分配,反之代表未分配。同时我们可以预处理 g 数组,g[s] = t 含义为选择 cs 状态为 s 时得到的饼干总和为 t

初始化只有 f[0][0]=0f[0][0] = 0f[0][0]=0,其余均为正无穷 0x3f3f3f3f

不失一般性考虑 f[i][s]f[i][s]f[i][s] 该如何计算,通过枚举第 iii 个小朋友所分配到的饼干情况 ps 的子集)进行转移:若第 iii 个小朋友分配到的饼干情况为 p,则此前 i−1i - 1i−1 个小朋友分配到饼干情况为 s−ps - ps−p,前 i−1i - 1i−1 个小朋友的最小不公平程度为 f[i−1][s−p]f[i - 1][s - p]f[i−1][s−p],当前第 iii 个小朋友的不公平程度为 g[p]g[p]g[p],两者中最大值可用于更新 f[i][s]f[i][s]f[i][s]。

f[i][s]=min⁡(f[i][s],max⁡(f[i−1][s−p],g[p])),p⊆sf[i][s] = \min(f[i][s], \max(f[i - 1][s - p], g[p])), p \subseteq sf[i][s]=min(f[i][s],max(f[i−1][s−p],g[p])),p⊆s

最终 f[k][2n−1]f[k][2^n - 1]f[k][2n−1] 即是答案。

Java 代码:

class Solution {
    public int distributeCookies(int[] cs, int k) {
        int n = cs.length, mask = 1 << n, INF = 0x3f3f3f3f;
        int[] g = new int[mask];
        for (int s = 0; s < mask; s++) {
            int t = 0;
            for (int i = 0; i < n; i++) t += ((s >> i) & 1) == 1 ? cs[i] : 0;
            g[s] = t;
        }
        int[][] f = new int[k + 10][mask];
        for (int i = 0; i <= k; i++) Arrays.fill(f[i], INF);
        f[0][0] = 0;
        for (int i = 1; i <= k; i++) {
            for (int s = 0; s < mask; s++) {
                for (int p = s; p != 0; p = (p - 1) & s) {
                    f[i][s] = Math.min(f[i][s], Math.max(f[i - 1][s - p], g[p]));
                }
            }
        }
        return f[k][mask - 1];
    }
}

Python 代码:

class Solution:
    def distributeCookies(self, cs: List[int], k: int) -> int:
        n, mask, INF = len(cs), 1 << len(cs), 0x3f3f3f3f
        g = [0] * mask
        for s in range(mask):
            t = 0
            for i in range(n):
                t += cs[i] if (s >> i) & 1 == 1 else 0
            g[s] = t
        f = [[INF] * mask for _ in range(k + 10)]
        f[0][0] = 0
        for i in range(1, k + 1):
            for s in range(mask):
                p = s
                while p != 0:
                    f[i][s] = min(f[i][s], max(f[i - 1][s - p], g[p]))
                    p = (p - 1) & s
        return f[k][mask - 1]

C++ 代码:

class Solution {
public:
    int distributeCookies(vector<int>& cs, int k) {
        int n = cs.size(), mask = 1 << n, INF = 0x3f3f3f3f;
        vector<int> g(mask, 0);
        for (int s = 0; s < mask; s++) {
            int t = 0;
            for (int i = 0; i < n; i++) t += ((s >> i) & 1) == 1 ? cs[i] : 0;
            g[s] = t;
        }
        vector<vector<int>> f(k + 10, vector<int>(mask, INF));
        for (int i = 0; i <= k; i++) fill(f[i].begin(), f[i].end(), INF);
        f[0][0] = 0;
        for (int i = 1; i <= k; i++) {
            for (int s = 0; s < mask; s++) {
                for (int p = s; p != 0; p = (p - 1) & s) {
                    f[i][s] = min(f[i][s], max(f[i - 1][s - p], g[p]));
                }
            }
        }
        return f[k][mask - 1];
    }
};

TypeScirpt 代码:

function distributeCookies(cs: number[], k: number): number {
    const n = cs.length, mask = 1 << n, INF = 0x3f3f3f3f;
    const g = new Array(mask).fill(0);
    for (let s = 0; s < mask; s++) {
        let t = 0;
        for (let i = 0; i < n; i++) t += ((s >> i) & 1) === 1 ? cs[i] : 0;
        g[s] = t;
    }
    const f = new Array(k + 10).fill(0).map(() => new Array(mask).fill(INF));
    f[0][0] = 0;
    for (let i = 1; i <= k; i++) {
        for (let s = 0; s < mask; s++) {
            for (let p = s; p != 0; p = (p - 1) & s) {
                f[i][s] = Math.min(f[i][s], Math.max(f[i - 1][s - p], g[p]));
            }
        }
    }
    return f[k][mask - 1];
};
  • 时间复杂度:将 cs 长度记为 nnn,状态数量记为 m=2nm = 2^nm=2n,预处理复杂度为 O(n×m)O(n \times m)O(n×m);DP 过程需要枚举二进制长度为 nnn 的所有子集的子集,复杂度为 O(3n)O(3^n)O(3n),DP 过程复杂度为 O(k×3n)O(k \times 3^n)O(k×3n)。整体复杂度为 O(k×3n)O(k \times 3^n)O(k×3n)

  • 空间复杂度:O(k×m)O(k \times m)O(k×m)

小答疑

其实关于为什么要用 0x3f3f3f3f 来充当 ♾️,每次都会在评论区进行答疑。

这次干脆整合到文章中好了。

为什么使用 0x3f3f3f3f 来充当 ♾️,而不是使用其他诸如 INT_MAX 来充当 ♾️?

首先, 0x3f3f3f3fINT_MAX 均为同一数量级,均大于一般的数据范围 10^9,均能满足 ♾️ 要求,这是前提。

另外,使用 0x3f3f3f3f 相比于使用 INT_MAX ,有如下的额外好处:

  1. 0x3f3f3f3f 乘 222 不会发生溢出

  2. 0x3f3f3f3f 每字节都是 0x3f,因此 C++ 可以直接通过 memset(array, 0x3f, sizeof(array)) 的方式来得到一个初始值为无穷大的数组,而无需使用循环赋值的方式来做

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

欢迎关注,明天见。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地[1] 🎉🎉

关于本文 https://juejin.cn/post/7331176540704260123

公号文章分七类

随时都会有更新

程序员

  1. 真诚利他

  2. 一个30岁前端老社畜的人生经历

  3. 2023年中大厂面试经历分享,很可惜,但是没关系

  4. 给迷茫的朋友一点建议吧,主要是前端方向的。

  5. 37岁的老前端在大专院校教前端

  6. 一个30岁老前端的人生经历(学习+工作+婚姻+孩子),给迷茫的朋友一点激励。

  7. 程序员如何应对ChatGPT带来的改变

  8. 尤雨溪解读 2022 Web 前端生态趋势

  9. 阿里前端:我的老婆失业了,周围同事也在不断被裁

  10. 一个月薪 12000 的北京程序员的真实生活

  11. 作为前端,工作中处理过什么复杂的需求?

  12. 尤雨溪亲自回应Vue.js涉及国家安全漏洞问题

  13. 开源作者恶意搞破坏,谁来为开源买单?

  14. 程序员裸辞后,在家全职接单一个月的感触

  15. 2022年如何成为一名优秀的大前端Leader?

面试

  1. 14个JS面试难点深入解读与代码实现

  2. 中小型公司三年工作经验的面试经历

  3. 2023年中大厂面试经历分享,很可惜,但是没关系

  4. 面试官:能不能给 Promise 增加取消功能和进度通知功能... 我:???

  5. 一个22届被裁前端思想上得转变

  6. 23年底,两年前端菜狗被裁后的面试经历

  7. 一年空窗期后我是如何准备面试的?

  8. 一份比较完整的字节技术面试题,包含算法、计算机网络和前端等

  9. 面试官:请使用 JS 完成一个 LRU 缓存?

  10. 正确介绍自己的项目,终于不用害怕面试了

  11. 本人是工作 11 年的老前端,面试一个月忽悠了十几个 offer

JavaScript

  1. 14个JS面试难点深入解读与代码实现

  2. ES14数组升级来袭,这六个新API助你高效开发

  3. FaceBook 开源 AtomicCss 解决方案:Stylex

  4. 前端是怎么解析Excel、PDF、Word、PPT等文件的?

  5. 面试官:能不能给 Promise 增加取消功能和进度通知功能... 我:???

  6. 14个提高JavaScript代码质量的小技巧

  7. JS es6仿网易云音乐播放器

  8. WebSocket 从入门到入土

  9. 如何构建一个仅有2KB大小、无依赖的状态管理器(以及它如何帮我获得两个不同的工作机会)

  10. JS代码其实可以这样写

  11. 详解HTML中的拖拽案例和难点分析

  12. 20 个 JS 工具函数助力高效开发

  13. 使用 JavaScript 编写更好的条件语句

  14. JS 运行机制最全面的一次梳理

  15. 8个console.log的解决方案

  16. 25个有用的 JavaScript 单行代码

  17. 前端工程师都在忙些什么?

  18. 我用 80 行核心 JS 代码每个月躺着挣一瓶肥宅快乐水

  19. localStorage 的高阶用法

  20. 某一线前端小组长的 Code Review 分享

  21. 一行 Object.keys() 引发的思考

  22. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

  23. 常用的前端JavaScript方法封装

  24. 刷算法题常用的JS基础扫盲

  25. 2022前端应该掌握的10个 JS 小技巧

  26. Three.js实现跳一跳(在线玩)

  27. 10个常用的JS工具库,80%的项目都在用!

  28. 我的代码简洁之道

  29. 一行 Object.keys() 引发的血案

前端开发

  1. 聊一聊自己的前端之路以及后面晋升的一些想法

  2. 如何做好前端项目组组长

  3. 如何构建一个仅有2KB大小、无依赖的状态管理器(以及它如何帮我获得两个不同的工作机会)

  4. 高级前端开发工程师必备:Hooks、React Router v6 和状态管理

  5. 高级前端开发工程师必知:浏览器解析代码、JavaScript代码执行流程、原型链与闭包

  6. 高级前端开发工程师必备:Hooks、React Router v6 和状态管理

  7. 高级前端开发工程师必知:浏览器解析代码、JavaScript代码执行流程、原型链与闭包

  8. JS代码其实可以这样写

CSS

  1. CSS中的相对单位和绝对单位,以及rem自适应布局

  2. 10个常见渐变交互效果

  3. CSS动画的实现和最佳优化实践

  4. 现代CSS中的换行布局技术

  5. 你知道flex: 0 0 200px;和grid-template-columns: repeat(3, 1fr);的含义吗?

  6. 10 个不错的 CSS 小技巧

  7. 为什么会存在1px问题?怎么解决?

  8. 2022 年的 CSS 全览

  9. CSS mask 实现鼠标跟随镂空效果

AI

  1. 无代码工具+人工智能:19岁少年月入5000美元,八款免费工具助你在线赚钱!

  2. AI 时代来临,这些 AI 工具让你的工作更加高效!

  3. 程序员如何应对ChatGPT带来的改变

  4. 10个热门的ChatGPT项目推荐

  5. ChatGPT 8个场景下的灵活应用技巧,让您事半功倍!

资源

  1. 程序员必看!15个优秀的中文技术博客汇总

  2. AI 时代来临,这些 AI 工具让你的工作更加高效!

  3. 程序员如何应对ChatGPT带来的改变

  4. 10个热门的ChatGPT项目推荐

  5. 推荐15个有用的前端技术博客

  6. 尤雨溪解读 2022 Web 前端生态趋势

  7. 2022,VSCode 前端插件推荐

  8. 几个高级前端常用的API

  9. 30个前端开发人员必备的顶级工具

  10. 45 个 Git 经典操作场景,专治不会合代码

  11. 推荐 10 个很“哇塞”的Web“资源”给前端工友,收藏等于学会~

  12. 送给 xdm 的 10 个 web 在线前端资源,优雅永不过时~

  13. 干货!移动端真机调试指南,对调试说easy

  14. 25 个前端相关的学习网站和一些靠谱的小工具

最后

欢迎长按图片加好友,我会第一时间和你分享前端行业趋势,面试资源,学习途径等等。

8df50e28bb20d424edccf39046e216e9.png

添加好友备注【加群】拉你进技术交流群

公众号前端开发博客 专注 前端开发技术,分享 前端开发资源WEB前沿资讯,如果喜欢我的分享,给 宝哥 点一个 或者 分享 都是对我的支持

关注公众号后,在首页:

  • 回复「小抄」,领取Vue、JavaScript 和 WebComponent 小抄 PDF

  • 回复「Vue脑图」获取 Vue 相关脑图

  • 回复「思维图」获取 JavaScript 相关思维图

  • 回复「简历」获取简历制作建议

  • 回复「简历模板」获取精选的简历模板

  • 回复「电子书」下载我整理的大量前端资源,含面试、Vue实战项目、CSS和JavaScript电子书等。

  • 回复「知识点」下载高清JavaScript知识点图谱

  • 回复「读书」下载成长的相关电子书

老规矩,学会了点个赞或在看呀~ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值