两道JS面试题
写在开头
我最近正在找工作中,不过是骑驴找马。感觉形势很严峻,现在不敢随便裸辞了🥶。
金三银四好像真的成为了过去式,感觉铜三铁四差不多!!!
还记得以前,只要稍微上某招牌APP上瞄一眼,一会功夫就一大堆主动上门打招呼了(大多是外包,有小公司的,有大厂的,对技术大厂感兴趣的,前后端测试捞人,也可以看看机会)。现在呢,海投上千份,全是已读不回,邀约面试也是寥寥无几,屈指可数,这就是现状,你品,你细品。(当然,也可能是我太菜了😁)
不过,最近这两周还是断断续续面试了几家企业,而本章就来分享其中遇到的两道稍微比较有趣的题目叭。
正文
请设计一个 combinations
函数,它接收一个数字数组,要求返回这些数字的所有可能组合情况。
function combinations(nums) { ... } combinations([1]); // [[], [1]]; combinations([1, 2]); // [[], [1], [1, 2], [2]]; combinations([1, 2, 3]); // [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]];
初看这题目,Em...好像是一个无序组合,刷题刷到过😃,心想这题稳了,一个二层循环就能搞定,完美拿下。
先贴最终代码:
function combinations(nums) { // 开头加一个空组合,即不选择任何数字的情况 const result = [[]]; // 1. 遍历这些数字 for (let n of nums) { // 获取当前结果一共有多少,作为子循环的次数 const length = result.length; // 2. 子循环 for (let i = 0; i < length; i++) { // 3. 重要点:把上一个结果和下一个数字组合成一个新的结果 result.push([...result[i], n]); } } return result; }
虽然当时心里想得挺简单,结果现场写得时候还是折腾了好一会儿,也有一些细微的错误😔,所幸最终大体还是写出来。(真的好想吐槽手写代码。。。。)
面试后,回来又重新写了一遍,整理了上面那个版本,还另外写了一个递归版本,原理都差不多,都可以看看,如下:
function combinations(nums) { const result = []; function loop(currentResult, count) { result.push([...currentResult]); for (let i = count; i < nums.length; i++) { currentResult.push(nums[i]); // 递归 loop(currentResult, i + 1); // 注意一定要删除临时保存的结果 currentResult.pop(); } } loop([], 0); return result; }
请设计一个计算器(Counter)类,它能使用加法、减法、乘法、除法的操作,并且有一个能获取结果(get)的方法,并通过可选链式调用而工作。
具体原题描述我已经记不太清了😗,反正就是搞一个计算器功能,关键步骤是要实现链式调用,有点像是柯里化函数,但可能稍微更简单一些。
class Counter { result = 0; // 加法 addition(val) { this.result += val; return this; } // 减法 subtraction(val) { this.result -= val; return this; } // 乘法 multiplication(val) { this.result *= val; return this; } // 除法 division(val) { this.result /= val; return this; } get() { return this.result; } }
具体使用:
const counter = new Counter(); const result = counter.addition(2).subtraction(1).addition(19).division(2).multiplication(2).get(); // 20
基础功能还是相对比较简单,但后面好像还有一个要求是实现"先乘除后加减"的规则,奈何我太菜就没写出来,如果有大佬写出来了,欢迎评论区留言😁。
哦,对了,还有一个函数版本的,感兴趣可以瞧瞧:
function counter() { let result = 0; function addition(val) { result += val; return this; } function subtraction(val) { result -= val; return this; } function multiplication(val) { result *= val; return this; } function division(val) { result /= val; return this; } function get() { return result; } return { addition, subtraction, multiplication, division, get }; }
——转载自作者:橙某人