面試官:你能回答這兩個簡單的問題嗎
作者:前端小智
簡介:思否百萬閱讀,勵志退休后,回家擺地攤的人。
來源:SegmentFault 思否社區(qū)
背景
這是我的朋友在最近一次面試中被問到的兩個問題,來一起學(xué)習(xí)一下。
1. 如何防止重復(fù)發(fā)送多個請求?
問題:
在我們的工作中,經(jīng)常需要只發(fā)送一次請求,以防止用戶重復(fù)點擊。
請編寫請求方法(執(zhí)行后返回 promise)并返回一個新方法。當(dāng)連續(xù)觸發(fā)時,將只發(fā)送一個請求。
事例
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) {
// 如果請求的實例已經(jīng)存在,說明請求正在進行中,
// 直接返回該實例,而不觸發(fā)新的請求。
return p
? p
// 否則就發(fā)送該請求,并在Promise結(jié)束時將p設(shè)置為null,然后可以重新發(fā)送下一個請求
: (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. 兩數(shù)之和
這是力扣的第1題,請看這里:https://leetcode.cn/problems/two-sum/
給定一個整數(shù)數(shù)組 nums 和一個整數(shù)目標值 target,請你在該數(shù)組中找出 和為目標值 target 的那 兩個 整數(shù),并返回它們的數(shù)組下標。
你可以假設(shè)每種輸入只會對應(yīng)一個答案。但是,數(shù)組中同一個元素在答案里不能重復(fù)出現(xiàn)。
你可以按任意順序返回答案。
示例 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 循環(huán)
我們最快想到的方式就是暴力破解,直接用 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 ]
}
}
}
}
面試官表揚了她的快速回答,但他對結(jié)果并不滿意,他認為有進一步優(yōu)化的可能。

方法2:使用 Map
通常,當(dāng)使用兩個for循環(huán)來求解一個問題時,我們需要意識到算法的時間復(fù)雜度(o(n2))是可以優(yōu)化的。
事實上,我們可以用一個 "for"循環(huán)來做,只要把加法變成減法,并且把遍歷的值儲存在一個對象sumCache中。
例如:
輸入: [2,7,11,15]
步驟1:
讀取 2, 此時 sumCache 為空。 在 sumCache 中存儲 2 作為鍵,索引 0 作為值。

讀 7,發(fā)現(xiàn)目標值是 9-7 = 2。 2 存在于 sumCache中,0 和 1 的索引將被直接返回。



評論
圖片
表情
