花位欧弟社招一面(1小时)
1.个人介绍
2.工作和项目问题
3.CSS画椭圆
4.项目如何做兼容的
5.js会发生阻塞吗
6.扩展运算符?这种拷贝属于浅拷贝还是深拷贝,扩展运算符为什么算浅拷贝?深拷贝了解吗?
7.setTimeout和setInterval?setTimeout设置0会发生什么?为什么会这样?为什么会有setTimeout和setInterval这两个API(背景和设计初衷,其实就是因为JS是单线程,为了避免阻塞和处理长时间的任务,所以设计了这些东西)?
8.你是如何判断项目的性能好不好的?你能不能单独检测某个功能或者某个组件的性能?
9.如何处理大量数据?
10.事件循环
11.Vue的虚拟dom
12.package.json 中的各种 dependencies ?(没想到会问这种)
13.package.json中^符号和~符号前缀的区别
14.ES6模块化
15.vue 中 key 的作用?为什么不能用 index 作为 key
16.Vue2和Vue3 ? defineProperty 和 Proxy?
17.内存管理?垃圾回收机制?
暂时想起这么多了
后面就是手撕题目:
反编码字符串, 将类似 k[ str ] 写成k次str字符串的组合。 例如" 3[a]4[b]"最终为aaabbb,"2a2[bc3[d]]ef"最终生成aabcdddbcdddef。这里其实和简易计算机一样,用两个栈,一个字符串栈一个数字栈解决就比较稳,我当时脑子一热用一个栈就卡死了导致最后太菜没写完。还是得多练算法题
一个栈写法:
function decodeString(s) { let stack = []; let currentNum = 0; let currentStr = ''; for (let char of s) { if (char >= '0' && char <= '9') { // 如果是数字,则累积到 currentNum 中 currentNum = currentNum * 10 + parseInt(char, 10); } else if (char === '[') { // 遇到左括号,将当前的 currentNum 和 currentStr 压入栈,并重置它们,注意初次的currentNum为3,currentStr为空字符串'' stack.push([currentStr, currentNum]); currentStr = ''; currentNum = 0; } else if (char === ']') { // 遇到右括号,弹出栈顶元素进行拼接 //此时的prevStr是空字符串'',num为3,currentStr为a //下一次prevStr是aaa,num为2,currentStr为bc //当时我没注意直接用弹出的prevStr和num直接算,导致一直没得到想要的结果,所以才错过 let [prevStr, num] = stack.pop(); currentStr = prevStr + currentStr.repeat(num); } else { // 对于普通字符,直接添加到 currentStr 中 currentStr += char; } } return currentStr; } // 示例用法: console.log(decodeString("3[a]2[bc]")); // 输出: "aaabcbc" console.log(decodeString("3[a2[c]]")); // 输出: "accaccacc" console.log(decodeString("2[abc]3[cd]ef")); // 输出: "abcabccdcdcdef"
两个栈写法
function decodeString(s) { let numStack = []; // 存储重复次数的栈 let strStack = []; // 存储当前字符串片段的栈 let currentStr = ''; // 当前正在构建的字符串片段 let k = 0; // 当前读取到的数字 for (let char of s) { if (char >= '0' && char <= '9') { // 如果是数字,则累积到 k 中 k = k * 10 + parseInt(char, 10); } else if (char === '[') { // 遇到左括号,将当前的 k 和字符串片段压入栈中,并重置它们 numStack.push(k); strStack.push(currentStr); currentStr = ''; // 开始新的字符串片段 k = 0; // 重置计数器 } else if (char === ']') { // 遇到右括号,弹出栈顶元素进行拼接 let prevStr = strStack.pop(); let num = numStack.pop(); currentStr = prevStr + currentStr.repeat(num); } else { // 对于普通字符,直接添加到当前字符串片段中 currentStr += char; } } return currentStr; } // 示例用法: console.log(decodeString("3[a]2[bc]")); // 输出: "aaabcbc" console.log(decodeString("3[a2[c]]")); // 输出: "accaccacc" console.log(decodeString("2[abc]3[cd]ef")); // 输出: "abcabccdcdcdef"#华为od##前端##社招##面试##面经#