一面
听你说你刷了些 lt 算法题,来,我们先做道题
1. 给一个无序数组,让你判断能否组成一个等差数列(排序算法很简单,不排序呢)。
排序算法,先排序,取最小值及次小值 ,相减得差,挨个便利数组元素比差。
非排序算法,第一次遍历取最小值,第二次遍历取次小值,数组中每个元素与最小值的差 除以 次小值跟最小值的差是整数倍,通过一个数组记录其是否出现过。
// 排序实现 const isArithmeticSequence = function (arr) { let len = arr.length; if (len <= 2) { return true; } arr.sort((a, b) => a - b); let gap = arr[1] - arr[0]; for (let i = 2; i < len; i++) { if (arr[i] - arr[i - 1] !== gap) { return false; } } return true; } let arr = [2, 4, 6, 10, 8, 12]; console.log(isArithmeticSequence(arr)); // true console.log(isArithmeticSequence([2, 5, 6, 8, 10])); // false // 非排序实现 const isArithmeticSequence = function (arr) { let len = arr.length; if (len <= 2) { return true; } let min1 = Math.min(...arr); let minIndex = arr.indexOf(min1); let min2 = Math.min(...arr.slice(0, minIndex), ...arr.slice(minIndex + 1)); let gap = min2 - min1; let set = Array(len).fill(0); for (let num of arr) { let times = (num - min1) / gap; if (set[times] === 0) { set[times] = 1; } else { return false; } } return true; } let arr = [2, 4, 6, 10, 8, 12]; console.log(isArithmeticSequence(arr)); // true console.log(isArithmeticSequence([2, 5, 6, 8, 10])); // false实际面试过程中,非排序算法面试官给了提示,也没让我具体写。在时间复杂度上,排序O(nlogn)),非排序 O(n),即线性复杂度,这也是面试官考察面试者非排序算法的原因。
2. 数据整合
let input = [{ count: 1, value: 2 }, { count: 3, request: 2}, { response: 0 } ]; // => {count: 4, value: 2 ......} const addAll = function (input) { let res = {}; input.forEach((obj) => { Object.keys(obj).forEach((k) => { if (res[k] === undefined) { res[k] = obj[k]; } else { res[k] += obj[k]; } }) }) return res; } console.log(addAll(input)); // { count: 4, value: 2, request: 2, response: 0 }用 reduce 也行,感兴趣的同学可以自己试下。
3. 你刷过lt,一定知道有效的括号,给出一个数字 n , 表示有 n 对括号" () ",需要返回能够组成的有效的括号序列的组合数,不需要输出具体的组合方式。
听到面试官说不要返回组合方式,第一反应是 dp 。后面在面试官给到了转移方程的前提下写完了代码。
const validParenthesesCnt = function (n) { let dp = Array(n + 1).fill(0); dp[0] = 1; for (let i = 1; i <= n; i++) { for (let j = 0; j < i; j++) { dp[i] = dp[i] + dp[j] * dp[i - j - 1]; } } return dp[n]; } console.log(validParenthesesCnt(0)); // 1 console.log(validParenthesesCnt(1)); // 1 () console.log(validParenthesesCnt(2)); // 2 ()() (()) console.log(validParenthesesCnt(3)); // 5 ((())) ()()() (())() ()(()) (()())4. 鼠标悬停,展示下拉菜单;如何不依赖js实现
当时说伪类:hover 配合 visibility 属性(说的不对的地方还请各位牛友指正)。
.button .drop-down { visibility: hidden; } .button:hover .drop-down { visibility: visiable; }5. 实现 useToggle,为难.jpg,面试官表示辣我也不为难你。
6.反问:你对应届生的预期。 面试官:说实话你还蛮符合我对应届生的预期的。 双方蛤蛤蛤蛤蛤。
二面
二面
1. 填充 inherit 完成输出。
function inherit() { } let animalNum = 0; function Animal(name) { animalNum ++; this.name = name; } Animal.prototype.getName = function() { return this.name; }; const Cat = inherit(Animal, { say:function() { console.log(`NO${animalNum}:${this.getName()}`); } }); const cat1 = new Cat('小花'); cat1.say(); // NO1:小花
本来想推荐有兴趣的同学搜一下 mdn object.create() 的,不知道是不是因为 Mozilla 裁员的关系,至少我这儿 mdn 官网打不开。。。
实现(注释里头提供了一种备选的方式): function inherit(Fn,obj) { function ret (name) { Fn.call(this, name); } // function F () {} // F.prototype = Fn.prototype; // var prototype = new F(); //创建对象 // Object.assign(prototype, obj); // prototype.constructor = ret; //增强对象 // ret.prototype = prototype; //指定对象 ret.prototype = Object.create(Fn.prototype); Object.assign(ret.prototype, obj); ret.prototype.constructor = ret; return ret; }2. 给你一个存放 url 的数组,要求按序请求资源, 用fetch请求就行,关键词: map, Promise, reduce
3. 优化项目的手段有哪些?
(1) http 缓存
(2) 负载均衡
(3) script async defer,async 不保证执行顺序, defer 保证顺序。
(4) 减少回流和重绘,改变 offsetHeight, offsetWeight 的值会导致回流,那单纯的访问呢,也会~
(5) 事件委托
。。。。。。。。。
二面效果一般,但是末了面试官还是说后续 hr 会联系你的。
三面
1. lt 130 被围绕的区域,将被围绕的 0 替换成 1,思路,对外圈的 0 做 dfs ,将其所连通的 0 替换成 '#' (任意非1的数据),然后整体遍历数组,0 => 1,'#' => 0。
1 1 0 1 1 1 0 1
0 1 0 1 => 0 1 0 1
1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 0
10分钟A了
2. https 建连过程
3. event loop, 看代码说输出,解释原因。
问:假如给你offer你能提前过来实习么?
答: 如果是正式 offer 那我很乐意来。
一周后 hr面
为什么要学计算机。经历过的项目。如何学习前端的。职业规划。。。。。
一周后(8.14)收到感谢信,捂泪哭,嘤嘤嘤。
原本以为跟三面面试官聊得好好的,以为稳了呢,哎。
全部评论
(10) 回帖