以下是腾讯及腾讯音乐娱乐(TME)前端岗位高频手撕题目详解,结合真题及考察要点整理,覆盖面试核心考点:


⚙️ 一、核心手撕题(腾讯/TME 必考)

1. Promise 并发控制(90%场次出现)
  • 题目:手写 Promise.all(需处理错误短路、位置保持)
  • 核心思路
    • 校验输入为数组,空数组直接 resolve([])
    • 遍历 Promise 数组,用 Promise.resolve 包装非 Promise 值。
    • 计数完成量,全部成功时返回结果数组;任一失败立即 reject
  • 边界处理
    Promise.myAll = (promises) => {if (!Array.isArray(promises)) return Promise.reject(new TypeError('Argument must be an array'));let count = 0, results = [];return new Promise((resolve, reject) => {promises.forEach((p, i) => {Promise.resolve(p).then(res => {results[i] = res; // 保持结果位置if (++count === promises.length) resolve(results);}).catch(reject); // 短路逻辑});if (promises.length === 0) resolve(results);});
    };
    
2. 数组扁平化(80%场次出现)
  • 题目:实现多层嵌套数组降维(如 [1, [2, [3]]] → [1, 2, 3]
  • 方案对比
    • 递归法:深度优先遍历,遇到数组则递归展开。
    • flat API:直接调用 arr.flat(Infinity)(需注意浏览器兼容性)。
    • Reduce 递归
      const flatten = (arr) => arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? flatten(cur) : cur), []);
      
3. 深拷贝(70%场次出现)
  • 考点:处理循环引用、特殊对象(Date/RegExp)
  • 代码关键点
    • 使用 WeakMap 缓存已拷贝对象,避免循环引用导致的栈溢出。
    • 特殊对象单独处理(如 new Date(obj))。
    function deepClone(obj, map = new WeakMap()) {if (obj === null || typeof obj !== 'object') return obj;if (map.has(obj)) return map.get(obj);const clone = obj instanceof Date ? new Date(obj) : obj instanceof RegExp ? new RegExp(obj): Array.isArray(obj) ? [] : {};map.set(obj, clone);Reflect.ownKeys(obj).forEach(key => {clone[key] = deepClone(obj[key], map);});return clone;
    }
    

⚡️ 二、特色场景题(腾讯音乐TME高频)

1. 页面通信与崩溃监控
  • 题目:从页面A打开页面B,B关闭(含崩溃)时通知A
  • 解决方案
    • 正常关闭:在B的 window.onbeforeunload 中通过 localStoragepostMessage 传参,A监听 storagemessage 事件。
    • 崩溃监控
      • B页面定时(5s)向Service Worker发送"心跳"。
      • Service Worker检测超时(15s无心跳)判定崩溃,通知A页面。
      // B页面心跳发送
      setInterval(() => navigator.serviceWorker.controller.postMessage({ type: 'heartbeat' }), 5000);
      // Service Worker检测逻辑
      if (Date.now() - lastHeartbeat > 15000) reportCrash();
      
2. 大数相加(校招重点)
  • 题目:实现超过JS精度限制的数字加法(如 "9999999999999999" + "1"
  • 思路
    • 字符串反转,按位相加并处理进位。
    • 注意高位补位(如最终进位不为0)。
    function addBigNumbers(a, b) {const arr1 = a.split('').reverse(), arr2 = b.split('').reverse();let result = [], carry = 0;for (let i = 0; i < Math.max(arr1.length, arr2.length); i++) {const sum = (parseInt(arr1[i] || 0) + parseInt(arr2[i] || 0) + carry);result.push(sum % 10);carry = Math.floor(sum / 10);}if (carry) result.push(carry);return result.reverse().join('');
    }
    
3. 二叉树遍历(基础算法)
  • 题目:实现二叉树前序/中序/后序遍历(递归与非递归)
  • 递归示例
    const preorder = (root, res = []) => {if (!root) return res;res.push(root.val);        // 前序:根左右preorder(root.left, res);preorder(root.right, res);return res;
    };
    

💡 三、答题技巧与避坑点

  1. 原理深挖
    • 腾讯必问实现逻辑(如 Promise.all 的并发控制、深拷贝的循环引用处理)。
    • 避免只答API用法(如被追问“flat 的内部实现”)。
  2. 边界处理
    • 空输入、极端用例(如大数相加的进位溢出)需显式处理。
  3. 工程化思维
    • 结合业务场景(如页面崩溃监控需说明Service Worker的独立线程特性)。

腾讯系面试注重原理实现深度场景落地能力,建议优先掌握以上高频题,并扩展练习虚拟DOM Diff、响应式原理(Proxy/defineProperty)等进阶题。


JavaScript 算法详解

1. 最大公共前缀

/*** 查找字符串数组中的最长公共前缀* @param {string[]} strs 字符串数组* @return {string} 最长公共前缀*/
function longestCommonPrefix(strs) {let res='';if(strs.length===0)return res;const val=strs[0];for(let i=0;i<val.length;i++){let curChar=val[i];for(let j=0;j<strs.length;j++){if(strs[j][i]!==curChar)return res;if(j===strs.length-1) res+=curChar;}}return res;
}// 示例
console.log(longestCommonPrefix(["flower","flow","flight"])); // "fl"
console.log(longestCommonPrefix(["dog","racecar","car"])); // ""

算法思路

  1. 如果数组为空,直接返回空字符串
  2. 以第一个字符串作为初始公共前缀
  3. 遍历数组中的每个字符串,与当前公共前缀进行比较
  4. 如果不匹配,则缩短公共前缀,直到匹配或变为空字符串
  5. 返回最终的公共前缀

2. 最大子序列和

/*** 查找数组中连续子序列的最大和(Kadane算法)* @param {number[]} nums 数字数组* @return {number} 最大子序列和*/
function maxSubArray(nums) {let max=Math.max(...arr);let curSum=0;for(let i=0;i<arr.length;i++){curSum+=arr[i];max=Math.max(curSum,max);if(curSum<0)curSum=0;}return max;
}// 示例
console.log(maxSubArray([-2,1,-3,4,-1,2,1,-5,4])); // 6 (对应子序列 [4,-1,2,1])
console.log(maxSubArray([-1,-2,-3])); // -1

算法思路(Kadane算法)

  1. 初始化当前最大值和全局最大值为第一个元素
  2. 遍历数组:
    • 对于每个元素,决定是将其加入当前子序列还是开始新的子序列
    • 更新全局最大值
  3. 返回全局最大值

3. 重复子字符串

/*** 判断字符串是否可以由它的一个子串重复多次构成* @param {string} s 输入字符串* @return {boolean} 是否可以由子串重复构成*/
function repeatedSubstringPattern(s) {// 将字符串与自身拼接,然后去掉首尾字符const doubled = s + s;const sliced = doubled.slice(1, -1);// 如果原字符串出现在拼接后的字符串中,则可以由子串重复构成return sliced.includes(s);
}// 示例
console.log(repeatedSubstringPattern("abab")); // true (可由 "ab" 重复构成)
console.log(repeatedSubstringPattern("aba")); // false
console.log(repeatedSubstringPattern("abcabcabc")); // true (可由 "abc" 重复构成)

算法思路

  1. 将原字符串与自身拼接
  2. 去掉拼接后字符串的首尾字符
  3. 如果原字符串出现在处理后的字符串中,则说明可以由子串重复构成
  4. 这种方法利用了字符串旋转和模式匹配的原理

数学解释

  • 如果一个字符串S可以由子串重复构成,那么S = n*sub
  • 将S+S = 2n*sub
  • 去掉首尾字符后,中间至少包含一个完整的S = n*sub
  • 因此S会出现在处理后的字符串中

这三个算法分别展示了字符串处理和动态规划的经典问题解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92787.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92787.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92787.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软将于 10 月停止混合 Exchange 中的共享 EWS 访问

使用 Exchange 混合部署的组织应为未来几个月即将生效的新变化做好准备。微软已宣布&#xff0c;自 2025 年 8 月起&#xff0c;将在某些混合环境中暂时阻止使用 Exchange Online 共享服务主体的 Exchange Web 服务 (EWS) 流量。 此项变更主要影响使用“丰富共存”功能的组织&a…

STM32CubeMX + HAL 库:用硬件IIC接口实现AT24C02 EEPROM芯片的读写操作

1 概述1.1 实验目的本实验旨在通过 STM32 微控制器的硬件 IC 接口&#xff0c;对 AT24C02 外部 EEPROM 存储芯片 进行读写操作。实验演示了芯片地址配置、单字节/多字节读写、跨页写入&#xff08;Page Write&#xff09;功能。并提供完整的驱动代码&#xff0c;帮助读者深入理…

基于Android的音乐播放器/基于android studio的音乐系统/音乐管理系统

原生APP安卓开发设计之基于Android的音乐播放器/音乐系统/音乐管理系统[springboot]android studio

OmniHuman:字节推出的AI项目,支持单张照片生成逼真全身动态视频

本文转载自&#xff1a;OmniHuman&#xff1a;字节推出的AI项目&#xff0c;支持单张照片生成逼真全身动态视频 - Hello123。 ** 一、核心产品定位 OmniHuman 是字节跳动研发的 AI 视频生成技术&#xff0c;通过单张图像&#xff08;真人 / 动漫 / 3D 角色&#xff09;和音频…

5种无需USB线将照片从手机传输到笔记本电脑的方法

Android手机和平板电脑非常适合查看照片&#xff0c;因为这些移动设备可以随身携带&#xff0c;随时随地查看文件。然而&#xff0c;移动设备的存储空间非常有限&#xff0c;而且很容易丢失或损坏。因此&#xff0c;将重要的照片从Android设备传输到电脑进行备份是非常明智的决…

2025年渗透测试面试题总结-14(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 九十一、Android APP 逆向分析步骤 九十二、SQL注入分类 九十三、SQL注入防御 九十四、序列化与反序列化…

PG靶机 - Flu

一、初步侦察与服务识别 1.1 端口扫描 首先对目标主机 192.168.122.41 进行全端口扫描&#xff0c;以发现其上开放的网络服务。 sudo nmap 192.168.122.41 -p- --min-rate5000 -A图1: Nmap扫描结果&#xff0c;显示开放22, 8090, 和 8091端口 扫描结果显示&#xff0c;目标开放…

【Leetcode】随笔

文章目录题目一&#xff1a;路径总和 II&#xff08;LeetCode 113&#xff09;题目分析&#xff1a;解题思路&#xff1a;示例代码&#xff1a;代码解析&#xff1a;题目二&#xff1a;颜色分类&#xff08;LeetCode 75&#xff09;题目分析&#xff1a;解题思路&#xff1a;示…

深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器

在使用 FastMCP 开发 MCP 服务器时经常会用到 mcp.tool() 等装饰器。虽然它们用起来很简单&#xff0c;但当作黑匣子总让人感觉"不得劲"。接下来我们将深入相关的源码实现&#xff0c;别担心&#xff0c;不会钻没有意义的“兔子洞”&#xff0c;你可以通过这篇文章了…

Spring Boot 2.0 升级至 3.5 JDK 1.8 升级至 17 全面指南

一、版本升级背景升级动机 Spring Boot 2.0 到 3.5 的重大更新&#xff08;如Jakarta EE 9包路径变更、GraalVM支持等&#xff09;JDK 1.8 到 17 的语言特性升级&#xff08;如sealed class、record等&#xff09;安全性与性能优化需求升级目标 兼容性验证依赖库版本适配代码兼…

级数学习笔记

级数学习笔记 一、数学基础 1. 数项级数&#xff08;Number Series&#xff09; 数项级数是指形如&#xff1a; ∑(n1 to ∞) aₙ a₁ a₂ a₃ ...的无穷和。 1.1 收敛性判别法 比较判别法比值判别法根值判别法积分判别法莱布尼茨判别法&#xff08;交错级数&#xff09; 2…

Linux811 YUM;SHELL:if else fi,for

vsftpdok [rootweb ~]# vim vsftpdok.sh 您在 /var/spool/mail/root 中有新邮件 [rootweb ~]# cat vsftpdok.sh rpm -ql vsftpd >/dev/null 2>&1 if [ $? -eq 0 ];then echo "OK" else yum install vsftpd -y if [ $? -eq 0 ];then echo "install o…

运维学习Day20——MariaDB数据库管理

文章目录MariaDB 数据库管理介绍 MariaDB数据库介绍数据库种类关系数据库MariaDB 介绍部署 MariaDB安装 MariaDB加固 MariaDB连接 MariaDB配置 MariaDBMariaDB 中 SQL描述 SQL连接数据库数据库操作查询数据库列表使用数据库创建数据库删除数据库表操作环境准备查询表查询表列表…

itertools:迭代器函数

文章目录一、合并和分解迭代器1、chain&#xff1a;首尾相接2、zip / zip_longest&#xff1a;对齐取数3、islice&#xff1a;切片4、tee&#xff1a;分裂二、转换输入1、map / starmap&#xff1a;函数映射三、生成新值1、count&#xff1a;生成连续整数2、repeat&#xff1a;…

【AI论文】序列标注任务广义化研究(SFT广义化):基于奖励修正的强化学习视角

摘要&#xff1a;我们针对大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的监督微调&#xff08;Supervised Fine-Tuning&#xff0c;SFT&#xff09;提出了一种简单但具有理论依据的改进方法&#xff0c;以解决其与强化学习&#xff08;Reinforcemen…

(已解决)Mac 终端上配置代理

说明&#xff1a;为了便于理解&#xff0c;本文描述略显“抽象”与“潦草”&#xff0c;为了过审&#xff0c;仅供学习交流使用。&#x1f680; 简洁流程版启动工具 点击图标&#xff0c;复制它给出的终端命令将这段内容粘贴进你的配置文件中&#xff08;~/.zshrc 或 ~/.bash_p…

Anti-Aliasing/Mip-NeRF/Zip-NeRF/multi-scale representation

前言 CSDN的文章写太多&#xff0c;都不记得之前写的有什么了&#xff0c;但习惯了在这里记录&#xff0c;先写上吧。关于multi-scale representation又是看着忘着&#xff0c;还是写下点什么比较啊。时看时新&#xff0c;还是想吐槽自己看论文太不认真了。下面直接按照文章顺序…

板块三章节3——NFS 服务器

NFS 服务器 NFS 服务介绍 NFS 是Network File System的缩写&#xff0c;即网络文件系统&#xff0c;最早由Sun公司开发&#xff0c;**用来在UNIX&Linux系统间实现磁盘文件共享的一种方法。**它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。NFS客户端&…

数学建模——最大最小化模型

1.概念最大最小化模型&#xff08;Maximin Model&#xff09;是一种优化方法&#xff0c;旨在最大化最坏情况下的收益或最小化最坏情况下的损失。常见的现实问题有&#xff1a;求最大值的最小化问题最大风险的最低限度最小化最坏情况下的损失等2.一般数学模型 (找最大值里面最小…

【JAVA】使用系统音频设置播放音频

代码直接可以运行 import javax.sound.sampled.*; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets;public class SystemDefaultAudioPlayer {// 强制使用的通用音频格式private st…