两道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 };
}

——转载自作者:橙某人

全部评论

相关推荐

不愿透露姓名的神秘牛友
2024-12-18 15:35
程序员牛肉:完全是在胡写简历。 我很好奇你干嘛要在教育经历里面写你是软件二班的班长?你写它的目的是什么?我觉得真的就是很突兀。给我第一感觉就是:你真的是一个心智健全的成年人吗? 另外我也很好奇你是怎么做到参加了这么多所谓的计算机比赛,完事儿一个拿得出手的项目都没有。 自己的项目经历还是图书馆管理系统这种垃圾东西……我的的建议是你都不如大幅度删减一下自己的水奖项,看着真的给人一种又水又学傻了的感觉。 计算机不看奖项,看院校和个人能力。 计算机是强工科,你要投后端的你就应该明白,人家招你进去是指望你干活儿的。那你觉得你这份简历有展示出你的后端水平吗? 你动动你的脑子想一想,人家面试官要想通过你的简历看出你的项目开发能力,最重要的板块就是两个,第一个是你的实习,第二个是你的项目。你没有实习,是不是就应该在项目上好好琢磨琢磨? 你自己看看你项目写的什么描述,你作为一个要后端岗位的应届生,你对你自己项目的描述还仅仅停留在使用mySQL,使用JAVA,使用spring boot框架。给人一眼感觉就感觉完全就是你做的玩具。可能就是你哪一个学期做的课设。 对于应届生来讲,在项目板块要尽量突出自己的技术能力,因为谈业务你肯定也不懂。简单来讲,你的项目要清晰准确的表达:你用哪种技术解决了现有的哪种技术问题,带来了多少的效益提升? 所有关于项目的描述都围绕我说的这种表达方式去写。不要自己自嗨式的写一堆垃圾上去 你既没有实习项目,又没有一个比较好一点的项目,而且院校也比较差,所以找工作会异常的难找。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务