<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:你能回答這兩個簡單的問題嗎

          共 3845字,需瀏覽 8分鐘

           ·

          2022-05-28 17:48

          作者:前端小智

          簡介:思否百萬閱讀,勵志退休后,回家擺地攤的人。

          來源: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:


          1. 讀取 2, 此時 sumCache 為空。
          2. sumCache 中存儲 2 作為鍵,索引 作為值。

          步驟2:

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

          你認為使用 Map 的方法是否簡單明了,比for循環(huán)容易得多?

          這很好。我們得到了更好的結(jié)果。我們只多用了1.5M的空間,時間減少了近一半。


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



          點擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動和交流,掃描下方”二維碼“或在“公眾號后臺回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人操国产高清使劲操91 | 国产精品久久久久久久久夜色 | 逼特逼视频最新网址 | 你懂的在线视频 | 欧美99热 |