💡 《腾讯校招面经:那些让我头发少了一撮的前端笔试题》

260 阅读3分钟

前言

社团团长在群里分享了团友热乎的腾讯校招面试手写题,我看到之后也是迫不及待的开始给自己来了个模拟面试,直接在VSCode里面硬A了起来,下图是面试题题单分享

c0a59a35030ab679c07ba58275c0443.jpg

这里是博主自己写完后总结的面经分享

📜 题目一:正则三连击,字符串的“整容手术”

题干:有一个字符串 'abc345efgabcab',请用正则完成三个魔法操作。

解答

  1. 去掉所有a、b、c

    const result1 = str.replace(/[abc]/g, '');  
    // 效果:仿佛用吸尘器吸走了所有abc,留下"345efg"  
    
  2. 给数字穿上“中括号马甲”

    const result2 = str.replace(/(\d+)/g, '[$1]');  
    // 效果:数字345突然有了VIP包厢,变成"abc[345]efgabcab"  
    
  3. 让每个数字原地翻倍

    const result3 = str.replace(/\d/g, m => m * 2);  
    // 效果:3→6,4→8,5→10,于是"abc6810efgabcab"诞生了  
    

没想到第一道题就栽了跟头:大家可以去认认真真总结一遍正则语法,不然面试真的会被问的千疮百孔,呜呜呜/(ㄒoㄒ)/~~


📜 题目二:数组的“变形记”,谁动了我的原数组?

题干:以下代码输出什么?

const arr = [3, 1, 4, 1, 5, 9];  
const sortedArr = arr.sort((a, b) => a - b);  
console.log(sortedArr);  
console.log(arr);  

答案

[1, 1, 3, 4, 5, 9]  
[1, 1, 3, 4, 5, 9]  

解析
sort() 是一个“霸道总裁”方法,它会直接修改原数组
所以 sortedArr 和 arr 其实是同一个数组的“双胞胎马甲”。

教训:永远记得 sort() 会“毁掉”原数组,用前先 .slice() 保命!


📜 题目三:数组扁平化的“千层套路”

题干:如何把多层嵌套数组(如 [1, [2, [3]]])拍平成 [1,2,3]

解法大赏

  1. 递归 + reduce(经典永不过时)

    const flatten = arr =>  
      arr.reduce((acc, val) =>  
        acc.concat(Array.isArray(val) ? flatten(val) : val), []  
      );  
    
  2. flat() 秒杀(ES6 真香)

    const flattened = arr.flat(Infinity); // 无限拍平,专治各种不服  
    
  3. 暴力迭代法(while 循环警告)

    function flatten(arr) {  
      while (arr.some(item => Array.isArray(item))) {  
        arr = [].concat(...arr); // 一层层扒开它的心  
      }  
      return arr;  
    }  
    

面试官OS:我要看到你脑洞有多大!


📜 题目四:手写 Promise.all,感受异步的“集体主义”

题干:实现一个自己的 Promise.all,要求所有 Promise 成功时返回结果数组,一个失败则整体失败。

代码实现

function myPromiseAll(promises) {  
  return new Promise((resolve, reject) => {  
    const results = [];  
    let completed = 0;  
    promises.forEach((promise, index) => {  
      Promise.resolve(promise)  
        .then(res => {  
          results[index] = res;  
          completed++;  
          if (completed === promises.length) resolve(results);  
        })  
        .catch(reject); // 一人失败,全体翻车!  
    });  
  });  
}  

灵魂比喻:就像等外卖,必须所有餐都到了才能开饭,有一单超时?大家一起饿肚子吧!


📜 题目五:大数相加,字符串的“算盘游戏”

题干:用 JS 实现超大数字相加(避免精度丢失)。

核心思路

  1. 用字符串按位相加,模拟小学竖式计算。
  2. 处理进位,从右往左逐位计算。

代码片段

function addBigNumbers(a, b) {  
  let result = '';  
  let carry = 0;  
  let i = a.length - 1, j = b.length - 1;  
  while (i >= 0 || j >= 0 || carry > 0) {  
    const numA = i >= 0 ? parseInt(a[i--]) : 0;  
    const numB = j >= 0 ? parseInt(b[j--]) : 0;  
    const sum = numA + numB + carry;  
    result = (sum % 10) + result;  
    carry = Math.floor(sum / 10);  
  }  
  return result;  
}  

吐槽:JS 的 Number 类型表示大数时,比我的钱包还脆弱……


📜 题目六:二叉树前序遍历,递归的“闪电五连鞭”

题干:编写二叉树前序遍历函数(简写版)。

代码

function preorderTraversal(root) {  
  const result = [];  
  const traverse = node => {  
    if (!node) return;  
    result.push(node.val); // 先访问根  
    traverse(node.left);   // 再左子树  
    traverse(node.right);  // 最后右子树  
  };  
  traverse(root);  
  return result;  
}  

精简版(一行战神)

const preorder = root => root ? [root.val, ...preorder(root.left), ...preorder(root.right)] : [];  

面试官评价:这递归,很优雅,但下次记得问非递归写法哦~


🎯 总结

腾讯的笔试题仿佛在说:“我要看到你的代码会跳舞!”
—— 正则要快,数组要熟,Promise 要懂原理,算法还要会变魔术。

给读者的建议:多刷题,多写轮子,最重要的是……
记得 console.log(arr) 前备份你的数组!  😂

(偷偷擦掉冷汗,关上面试题库,深藏功与名…)