网站首页 > 技术文章 正文
背景
这是我的朋友在最近一次面试中被问到的两个问题,来一起学习一下。
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) // 1
firstFn().then(console.log) // 1
firstFn().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 = 1
let promiseFunction = () =>
new Promise((rs) =>
setTimeout(() => {
rs(count++)
}, 1000)
)
let firstFn = firstPromise(promiseFunction)
firstFn().then(console.log) // 1
firstFn().then(console.log) // 1
firstFn().then(console.log) // 1
setTimeout(() => {
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
猜你喜欢
- 2024-11-16 3.1 Python高级编程-函数式编程工具
- 2024-11-16 面向对象编程的一些思考(面向对象编程的理解)
- 2024-11-16 知识总结-Java8 Stream函数式编程
- 2024-11-16 bind、call、apply 区别?如何实现一个bind?
- 2024-11-16 Javascript基础重拾笔记之手写apply、call
- 2024-11-16 java 8新特性 常用内置函数式接口
- 2024-11-16 7、JavaScript 内置的常用对象有哪些?该对象常用的方法(必会)
- 2024-11-16 Java中“::”是什么含义(java中+是什么)
- 2024-11-16 Java 8 中的 Function:让代码从繁琐到简洁的魔法工具
- 2024-11-16 13万字详细分析JDK中Stream的实现原理(中)
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-