騰訊前端面試模擬詳解

以下是騰訊及騰訊音樂娛樂(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…