首页>>前端>>JavaScript->面试官:你能回答这两个简单的问题吗

面试官:你能回答这两个简单的问题吗

时间:2023-12-01 本站 点击:0

有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub  https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

背景

这是我的朋友在最近一次面试中被问到的两个问题,来一起学习一下。

1. 如何防止重复发送多个请求?

问题:

在我们的工作中,经常需要只发送一次请求,以防止用户重复点击。

请编写请求方法(执行后返回 promise)并返回一个新方法。当连续触发时,将只发送一个请求。

事例

function firstPromise () {  // ...Please fill in here}let count = 1;let promiseFunction = () =>  new Promise(rs =>    window.setTimeout(() => {      rs(count++)    })  )let firstFn = firstPromise(promiseFunction)firstFn().then(console.log) // 1firstFn().then(console.log) // 1firstFn().then(console.log) // 1

问题分析

与算法问题相比,这个问题相对简单,我们只需要使用闭包和Promise的特征就可以完成。

function firstPromise(promiseFunction) {  // Cache request instance  let p = null  return function (...args) {    // 如果请求的实例已经存在,说明请求正在进行中,    // 直接返回该实例,而不触发新的请求。    return p      ? p      // 否则就发送该请求,并在Promise结束时将p设置为null,然后可以重新发送下一个请求      : (p = promiseFunction.apply(this, args).finally(() => (p = null)))  }}

测试

let count = 1let promiseFunction = () =>  new Promise((rs) =>    setTimeout(() => {      rs(count++)    }, 1000)  )let firstFn = firstPromise(promiseFunction)firstFn().then(console.log) // 1firstFn().then(console.log) // 1firstFn().then(console.log) // 1setTimeout(() => {  firstFn().then(console.log) // 2  firstFn().then(console.log) // 2  firstFn().then(console.log) // 2}, 3000)

2. 两数之和

这是力扣的第1题,请看这里:https://leetcode.cn/problems/two-sum/

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

  示例 1:

输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6输出:[0,1]

方法一:使用两层 for 循环

我们最快想到的方式就是暴力破解,直接用 for 鲁,如下:

const twoSum = (nums, target) => {  const len = nums.length  for (let i = 0; i < len; i++) {    for (let j = i + 1; j < len ; j++) {      // find the answer, return      if (nums[ i] + nums[ j ] === target) {        return [ i, j ]      }    }  }}

面试官表扬了她的快速回答,但他对结果并不满意,他认为有进一步优化的可能。

方法2:使用 Map

通常,当使用两个for循环来求解一个问题时,我们需要意识到算法的时间复杂度(o(n2))是可以优化的。

事实上,我们可以用一个 "for"循环来做,只要把加法变成减法,并且把遍历的值储存在一个对象sumCache中。

例如:

输入: [2,7,11,15]

步骤1:

读取 2, 此时 sumCache 为空。

sumCache 中存储 2 作为键,索引 0 作为值。

步骤2:

7,发现目标值是 9-7 = 2。

2 存在于 sumCache中,0 和 1 的索引将被直接返回。

你认为使用 Map 的方法是否简单明了,比for循环容易得多?

这很好。我们得到了更好的结果。我们只多用了1.5M的空间,时间减少了近一半。

作者:fatfish   译者:前端小智  来源:medium

原文:https://javascript.plainenglish.io/interviewer-cant-you-answer-these-2-easy-questions-66ee93391f

编辑中可能存在的bug没法实时知道,事后为了解决这些bug,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。

交流

有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub  https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

原文:https://juejin.cn/post/7099587688075886622


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/JavaScript/6443.html