有哪些网页游戏网站,更换网站ico,网站标题优化,中国500强公司排名名单字节跳动 - 春招启动 随着各个大厂陆续打响春招的响头炮#xff0c;字节跳动也官宣了春季校园招聘的正式开始。 还是那句话#xff1a;连互联网大厂启动校招计划尚且争先恐后#xff0c;你还有什么理由不马上行动#xff1f;#xff01; 先来扫一眼「春招流程」和「面向群… 字节跳动 - 春招启动 随着各个大厂陆续打响春招的响头炮字节跳动也官宣了春季校园招聘的正式开始。 还是那句话连互联网大厂启动校招计划尚且争先恐后你还有什么理由不马上行动 先来扫一眼「春招流程」和「面向群体」 一般的大厂校招只会放出「岗位类型前端/后端/算法」和「要求说明」具体会分到什么部门 or 事业群是后面的事选择权往往不在候选人手上。 但字节则有所不同会在校招岗位中直接指明这是哪个部门 or 事业群的实习岗位。 因此可投岗位会很丰富好处是候选人会对岗位了解得比较清楚并且不会出现大量候选人都涌入某个投递口的情况 然后再看看和公主号相关性较高的岗位 以「前端工程师-基础架构」为例还有「国际电商/飞书/业务中台/搜索」等等 以「客户端开发工程师-国际化短视频」为例还有「直播/国际化短视频/互娱研发」等等 以「后端工程师-质量架构」为例还有「飞书/国际化/用户中台」等等 以「算法工程师-国际商品产品与技术」为例还有「Flow/UG/电商」等等 ... 回归主线。 字节是众多国内互联网大厂中以「算法面试」著称的大厂。 即使是字节社招中仍然会有较大的算法占比。 今天给大家分享一道「字节跳动」二面算法原题。 题目描述 平台LeetCode 题号895 设计一个类似堆栈的数据结构将元素推入堆栈并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。 void push(int val) 将一个整数 val 压入栈顶。 int pop() 删除并返回堆栈中出现频率最高的元素。 如果出现频率最高的元素不只一个则移除并返回最接近栈顶的元素。 示例 1 输入[FreqStack,push,push,push,push,push,push,pop,pop,pop,pop],[[],[5],[7],[5],[7],[4],[5],[],[],[],[]]输出[null,null,null,null,null,null,null,5,7,5,4]解释FreqStack new FreqStack();freqStack.push (5);//堆栈为 [5]freqStack.push (7);//堆栈是 [5,7]freqStack.push (5);//堆栈是 [5,7,5]freqStack.push (7);//堆栈是 [5,7,5,7]freqStack.push (4);//堆栈是 [5,7,5,7,4]freqStack.push (5);//堆栈是 [5,7,5,7,4,5]freqStack.pop ();//返回 5 因为 5 出现频率最高。堆栈变成 [5,7,5,7,4]。freqStack.pop ();//返回 7 因为 5 和 7 出现频率最高但7最接近顶部。堆栈变成 [5,7,5,4]。freqStack.pop ();//返回 5 因为 5 出现频率最高。堆栈变成 [5,7,4]。freqStack.pop ();//返回 4 因为 4, 5 和 7 出现频率最高但 4 是最接近顶部的。堆栈变成 [5,7]。 提示 push 和 pop 的操作数不大于 输入保证在调用 pop 之前堆栈中至少有一个元素 哈希表 这是一道很纯的哈希表题儿。 首先我们容易想到建立 「第一个哈希表 cnts 用于记录某个数值的出现次数cnts[val] c 含义为数值 val 当前在栈中的出现次数为 c。我们称该哈希表为「计数哈希表」」。 再结合每次 pop 需要返回「频率最大的元素若有多个则返回最考虑栈顶的一个」的要求我们还可以 「建立第二个哈希 map该哈希表以「出现次数 c」为键以「出现次数均为 c 的元素序列」为值map[c] A [...] 含义为出现次数为 c 的序列为 A并且序列 A 中的结尾元素为出现次数为 c 的所有元素中最靠近栈顶的元素。我们称该哈希表为「分桶哈希表」」。 最后再额外使用一个变量 max 记录当前最大出现频数不难发现max 必然是以步长 进行变化当出现次数为 max 的元素被 pop 掉了一个后必然剩下 max - 1 个因此当我们在某次 pop 操作后发现出现次数为 max 的集合为空时对 max 进行自减操作即可。 将题目给的样例作为 大家可以看看 cnts、map 和 max 三者如何变化以及 pop 的更新逻辑 Java 代码 class FreqStack { MapInteger, ListInteger map new HashMap(); MapInteger, Integer cnts new HashMap(); int max; public void push(int val) { cnts.put(val, cnts.getOrDefault(val, 0) 1); int c cnts.get(val); ListInteger list map.getOrDefault(c, new ArrayList()); list.add(val); map.put(c, list); max Math.max(max, c); } public int pop() { ListInteger list map.get(max); int ans list.remove(list.size() - 1); cnts.put(ans, cnts.get(ans) - 1); if (list.size() 0) max--; return ans; }} C 代码 class FreqStack {public: unordered_mapint, int freq; unordered_mapint, vectorint m; int maxv 0; void push(int val) { maxv max(maxv, freq[val]); m[freq[val]].push_back(val); } int pop() { int x m[maxv].back(); m[maxv].pop_back(); if (m[freq[x]--].empty()) maxv--; return x; }}; Python 代码 class FreqStack: def __init__(self): self.cnts defaultdict(int) self.map defaultdict(list) self.mv 0 def push(self, val: int) - None: self.cnts[val] 1 c self.cnts[val] self.map[c].append(val) self.mv max(self.mv, c) def pop(self) - int: ans self.map[self.mv].pop() self.cnts[ans] - 1 self.mv - 0 if self.map[self.mv] else 1 return ans TypeScript 代码 class FreqStack { map: Mapnumber, Arraynumber new Mapnumber, Arraynumber() cnst: Mapnumber, number new Mapnumber, number() max: number 0 push(val: number): void { if (!this.cnst.has(val)) this.cnst.set(val, 0) this.cnst.set(val, this.cnst.get(val) 1) const c this.cnst.get(val) if (!this.map.has(c)) this.map.set(c, new Arraynumber()) this.map.get(c).push(val) this.max Math.max(this.max, c) } pop(): number { const ans this.map.get(this.max).pop() if (this.map.get(this.max).length 0) this.max-- this.cnst.set(ans, this.cnst.get(ans) - 1) return ans }} 时间复杂度所有操作均为 空间复杂度所有入栈的节点最多会被存储两次一次在计数哈希表中一次在分桶哈希表中复杂度为 我是宫水三叶每天都会分享算法知识并和大家聊聊近期的所见所闻。 欢迎关注明天见。 更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地