自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一道字節(jié)筆試題,實現(xiàn)一個異步求和函數(shù)

數(shù)據(jù)庫 MySQL
我們可以兩兩一組,使用 Promise.all 求和,再把和兩兩一組繼續(xù)求和…..,知道只剩余一個就是最終的結(jié)果.

[[396984]]

題目:

提供一個異步 add 方法如下,需要實現(xiàn)一個 await sum(...args) 函數(shù):

  1. function asyncAdd(a, b, callback) { 
  2.   setTimeout(function () { 
  3.     callback(null, a + b); 
  4.   }, 1000); 

簡化:兩數(shù)之和

我們先來簡單的實現(xiàn)一個異步兩數(shù)之和函數(shù)

  1. function sumT(a, b) { 
  2.     return await new Promise((resolve, reject) => { 
  3.         asyncAdd(a, b, (err, res) => { 
  4.             if(!err) { 
  5.                 resolve(res) 
  6.             } 
  7.             reject(err) 
  8.         }) 
  9.     }) 
  10.  
  11. // 測試 
  12. const test = await sumT(1, 2) 
  13. console.log(test) 
  14. // 3 

加深:多數(shù)之和

上面我們實現(xiàn)了兩數(shù)之和,然后擴展到多數(shù)之和喃?

提到數(shù)組求和問題,我們首先想到的是 reduce

reduce() 方法對數(shù)組中的每個元素執(zhí)行一個由您提供的reducer函數(shù)(升序執(zhí)行),將其結(jié)果匯總為單個返回值。

—— MDN

  1. arr.reduce(callback(acc, cur[, idx[, arr]])[, initialValue]) 

callback 函數(shù)接收4個參數(shù):

  • acc :累計器
  • cur :當前值
  • idx :當前索引
  • arr :源數(shù)組

其中, initialValue 可選,

  • 如果有 initialValue :acc 取值為 initialValue , cur 取數(shù)組中的第一個值
  • 如果沒有:acc 取數(shù)組中的第一個值, cur 取數(shù)組中的第二個值
  1. const arr = [1, 2, 3, 4]; 
  2. const reducer = (acc, cur) => acc + cur; 
  3.  
  4. // 1 + 2 + 3 + 4 
  5. console.log(arr.reduce(reducer)); 
  6. // 輸出: 10 
  7.  
  8. // 5 + 1 + 2 + 3 + 4 
  9. console.log(arr.reduce(reducer, 5)); 
  10. // 輸出: 15 

關(guān)于本題:來自@champkeh

設(shè)置初始值為 Promise.resolve(0) ,經(jīng)歷 5 次求和:

  1. function sum(...args) { 
  2.     return new Promise(resolve => { 
  3.         args.reduce((acc, cur) => acc.then(total => sumT(total, cur)), Promise.resolve(0)).then(resolve) 
  4.     }) 
  5.  
  6. // 測試 
  7. await sum(1, 2, 3, 4, 5) 
  8. // 15 

但這存在一個耗時較長的問題,我們可以計算下時間:

  1. console.time("sum"
  2. // 測試 
  3. await sum(1, 2, 3, 4, 5) 
  4. // 15 
  5. console.timeEnd("sum"

也就是說,我們每次求和都會花費 1s,串行異步求和,這顯然不是最優(yōu)的

優(yōu)化:使用 Promise.all

我們可以兩兩一組,使用 Promise.all 求和,再把和兩兩一組繼續(xù)求和…..,知道只剩余一個就是最終的結(jié)果

  1. async function sum(...args) { 
  2.     // 用于考察每次迭代的過程 
  3.     console.log(args)  
  4.      
  5.     // 如果僅有一個,直接返回 
  6.     if(args.length === 1) return args[0] 
  7.     let result = [] 
  8.     // 兩兩一組,如果有剩余一個,直接進入 
  9.     for(let i = 0; i < args.length - 1; i+=2) { 
  10.         result.push(sumT(args[i], args[i + 1])) 
  11.     } 
  12.     if(args.length%2)  result.push(args[args.length-1]) 
  13.     // Promise.all 組內(nèi)求和 
  14.     return sum(...await Promise.all(result)) 
  15.  
  16. // 測試 
  17. test = await sum(1, 2, 3, 4, 5) 
  18. // 15 

  1. console.time("sum"
  2. await sum(1, 2, 3, 4, 5) 
  3. console.timeEnd("sum"

 

來自:https://github.com/Advanced-Frontend/Daily-Interview-Question

 

責任編輯:武曉燕 來源: 三分鐘學前端
相關(guān)推薦

2021-05-09 19:42:25

筆試題前端算法

2014-04-29 14:58:24

筆試題微軟筆試題

2022-04-08 07:52:17

CSS面試題HTML

2024-05-27 07:48:23

2021-05-31 07:55:44

smartRepeatJavaScript函數(shù)

2009-08-11 15:09:44

一道面試題C#算法

2024-10-11 17:09:27

2021-01-26 13:14:14

js前端map

2011-06-14 09:12:03

JavaScript

2009-06-22 13:43:00

java算法

2009-08-11 14:59:57

一道面試題C#算法

2018-03-06 15:30:47

Java面試題

2011-05-23 11:27:32

面試題面試java

2012-07-03 09:38:42

前端

2024-03-18 13:32:11

2019-09-02 15:06:16

面試字節(jié)跳動算法

2023-08-01 08:10:46

內(nèi)存緩存

2023-02-04 18:24:10

SeataJava業(yè)務(wù)

2009-08-11 10:12:07

C#算法

2017-11-21 12:15:27

數(shù)據(jù)庫面試題SQL
點贊
收藏

51CTO技術(shù)棧公眾號