前言
社团团长在群里分享了团友热乎的腾讯校招面试手写题,我看到之后也是迫不及待的开始给自己来了个模拟面试,直接在VSCode里面硬A了起来,下图是面试题题单分享
这里是博主自己写完后总结的面经分享
📜 题目一:正则三连击,字符串的“整容手术”
题干:有一个字符串 'abc345efgabcab',请用正则完成三个魔法操作。
解答:
-
去掉所有a、b、c:
const result1 = str.replace(/[abc]/g, ''); // 效果:仿佛用吸尘器吸走了所有abc,留下"345efg" -
给数字穿上“中括号马甲” :
const result2 = str.replace(/(\d+)/g, '[$1]'); // 效果:数字345突然有了VIP包厢,变成"abc[345]efgabcab" -
让每个数字原地翻倍:
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]?
解法大赏:
-
递归 + reduce(经典永不过时)
const flatten = arr => arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), [] ); -
flat()秒杀(ES6 真香)const flattened = arr.flat(Infinity); // 无限拍平,专治各种不服 -
暴力迭代法(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 实现超大数字相加(避免精度丢失)。
核心思路:
- 用字符串按位相加,模拟小学竖式计算。
- 处理进位,从右往左逐位计算。
代码片段:
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) 前备份你的数组! 😂
(偷偷擦掉冷汗,关上面试题库,深藏功与名…)