成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如果我去參加前端面試,我應該能做出大圣老師的這道題...

開發 前端
我是一名自學敲代碼的管理學研究生,喜歡 js/ts 但是菜得不行,平常挺關注國內的前端圈。除了讀雪碧大佬[1]等等大佬的知乎外(蒟蒻還看不太懂),平常也看看大圣老師[2]等等的B站。

[[417304]]

本文轉載自微信公眾號「Piper蛋窩」,作者Piper蛋。轉載本文請聯系Piper蛋窩公眾號。

我是一名自學敲代碼的管理學研究生,喜歡 js/ts 但是菜得不行,平常挺關注國內的前端圈。

除了讀雪碧大佬[1]等等大佬的知乎外(蒟蒻還看不太懂),平常也看看大圣老師[2]等等的B站。

有一次看大圣老師直播點評簡歷,他提到:“如果我來面試你,我就把我面前的筆記本給你,隨便給你打開個網頁比如淘寶,你給我用瀏覽器現場統計一下各個標簽出現的次數。”

!這道題應該不難?我分析無非就是考察了三點:

  • 最最基礎的瀏覽器調試能力
  • 算法能力
  • 基礎的 JavaScript API 應用

剛和爸媽打完球回來,那我就做做這道題。

首先咱捋一下思路:

  • 其實早在聽到這個題目時,我腦子中就蹦出兩個字:『遞歸』!
  • 畢竟,我們的網頁就是一棵 DOM 樹,從根部有子節點,子節點還有子節點,對于每個節點,我們能夠知道這個節點是什么標簽并且對其子節點做同樣的事就可以了

然后我們捋一下需要哪些技術細節:

  • 首先我們應該獲取根節點,這個好說,我們在瀏覽器的控制臺里試一試就知道:document.children[0]
  • 然后我們應該能夠獲取每個標簽對象的字符串名字和子節點列表,分別是 tagName 和 children
  • 至于如何實現「遞歸」呢?這里未必要用到遞歸,我用的是寬度優先搜索 BFS ,簡單一個隊列就能實現

值得一提的是,我近一個月里寫了基于 C++ 、Python 、 JavaScript/TypeScript 、 Scala/Java 的不同項目/小腳本(工作要求...),所以我也記不住 JavaScript 的 API ,我都是在瀏覽器控制臺里試出來的,比如 獲取標簽的名字是 tagName 、 獲取子節點 Array 是 children 。如下圖,我試關鍵詞試出來的,要不然誰記得住啊。

輸入 tag 會不會得到我想要的 API 呢?果然!

下面動手來做吧

第零步,打開瀏覽器的 Sources ,新建一個 Snippet 。

Sources

首先我不知道 JavaScript 里有沒有現成的隊列數據結構,應該是沒有,那我就自己實現一個吧。

  1. class Queue { 
  2.     #array = [] 
  3.     constructor () { 
  4.         this.#array = [] 
  5.     } 
  6.  
  7.     top () { 
  8.         return this.#array[0] 
  9.     } 
  10.  
  11.     size () { 
  12.         return this.#array.length 
  13.     } 
  14.  
  15.     pop () { 
  16.         this.#array.shift() 
  17.     } 
  18.  
  19.     push (ele) { 
  20.         this.#array.push(ele) 
  21.     } 

很簡單的封裝!我平時做算法題都是用 C++ ,所以這里方法的名稱就都盡量接近 C++ 的 std::queue

接下來咱們寫 BFS 就行了!

我看現在大佬們都把每個邏輯封裝在函數里,所以咱也把腳本運行邏輯 main() 里,然后再在外面調用一下 main() ,看著整潔點。

  1. const main = () => { 
  2.  
  3.     const dict = {} 
  4.     const queue = new Queue() 
  5.  
  6.     const htmlTag = document.children[0] 
  7.     dict[htmlTag.tagName] += 1  // !!! 
  8.     queue.push(htmlTag) 
  9.  
  10.     while (queue.size() > 0) { 
  11.         const t = queue.top() 
  12.         queue.pop() 
  13.  
  14.         for (let i = 0; i < t.children.length; i ++) { 
  15.             childTag = t.children[i] 
  16.             dict[htmlTag.tagName] += 1  // !!! 
  17.             queue.push(childTag) 
  18.         } 
  19.     } 
  20.  
  21.     for (let item in dict) { 
  22.         console.log(item, ': ', dict[item]) 
  23.     } 
  24.  
  25. main() 

上面是最最簡單的 BFS 實現了,可見這道題著實不是用算法難為我們,很實在的一道題。

注意我標注的 !!! 兩行,這里有一個問題:

  • dict = {} 中,對于未聲明過的鍵值,如果直接調用運算,會報錯 dict[未聲明的鍵值] +=1 // 報錯!
  • 而 js 又不是 Python ,沒有 setdefault 給我們用比如 dict.setdefault(鍵值, 0); dict[鍵值] += 1
  • js 也不是 C++ ,直接默認未出現過的鍵值的值為 0
  • 因此我們需要再寫一個 dict[未聲明的鍵值] +=1 功能

咱們把這個邏輯寫成一個 Effect ,返回一個函數,以顯示咱很注重邏輯復用性(劃去)。

  1. const addDictEffect =  (dict) => { 
  2.     return (name) => { 
  3.         if (dict[name]) { 
  4.             dict[name] += 1 
  5.         } else { 
  6.             dict[name] = 1 
  7.         } 
  8.     } 

OK 那下面在修改一下 main ,一共有三處!

  1. const main = () => { 
  2.  
  3.     const dict = {} 
  4.     const addDict = addDictEffect(dict)  // 第一處! 
  5.     const queue = new Queue() 
  6.  
  7.     const htmlTag = document.children[0] 
  8.     addDict(htmlTag.tagName)  // 第二處! 
  9.     queue.push(htmlTag) 
  10.  
  11.     while (queue.size() > 0) { 
  12.         const t = queue.top() 
  13.         queue.pop() 
  14.  
  15.         for (let i = 0; i < t.children.length; i ++) { 
  16.             childTag = t.children[i] 
  17.             addDict(childTag.tagName)  // 第三處! 
  18.             queue.push(childTag) 
  19.         } 
  20.     } 
  21.  
  22.     for (let item in dict) { 
  23.         console.log(item, ': ', dict[item]) 
  24.     } 
  25.  
  26. main() 

啪!很快啊,本題目解決。www.taobao.com 結果如下。

代碼

結果

其他網頁均可測試。

完整代碼

  1. class Queue { 
  2.     #array = [] 
  3.     constructor () { 
  4.         this.#array = [] 
  5.     } 
  6.  
  7.     top () { 
  8.         return this.#array[0] 
  9.     } 
  10.  
  11.     size () { 
  12.         return this.#array.length 
  13.     } 
  14.  
  15.     pop () { 
  16.         this.#array.shift() 
  17.     } 
  18.  
  19.     push (ele) { 
  20.         this.#array.push(ele) 
  21.     } 
  22.  
  23. const addDictEffect =  (dict) => { 
  24.     return (name) => { 
  25.         if (dict[name]) { 
  26.             dict[name] += 1 
  27.         } else { 
  28.             dict[name] = 1 
  29.         } 
  30.     } 
  31.  
  32. const main = () => { 
  33.  
  34.     const dict = {} 
  35.     const addDict = addDictEffect(dict) 
  36.     const queue = new Queue() 
  37.  
  38.     const htmlTag = document.children[0] 
  39.     addDict(htmlTag.tagName) 
  40.     queue.push(htmlTag) 
  41.  
  42.     while (queue.size() > 0) { 
  43.         const t = queue.top() 
  44.         queue.pop() 
  45.  
  46.         for (let i = 0; i < t.children.length; i ++) { 
  47.             childTag = t.children[i] 
  48.             addDict(childTag.tagName) 
  49.             queue.push(childTag) 
  50.         } 
  51.     } 
  52.  
  53.     for (let item in dict) { 
  54.         console.log(item, ': ', dict[item]) 
  55.     } 
  56.  
  57. main() 

目前不會js/ts+沒做過項目,菜到都沒法給大圣老師發簡歷讓他點評。期待早日能到發簡歷的地步。

 

責任編輯:武曉燕 來源: Piper蛋窩
相關推薦

2013-08-26 09:31:47

技術面試

2019-04-28 11:48:54

Python面試工程師

2020-12-17 09:44:02

前端開發后端

2023-12-12 07:40:52

JavaScript面試題前端

2009-09-28 10:58:45

招聘

2022-11-15 17:45:46

數據庫MySQL

2020-11-12 10:20:40

前端面試web

2018-11-09 09:10:19

程序員技能開發者

2023-06-26 08:24:23

JavaScriptAJAX

2019-09-02 15:06:16

面試字節跳動算法

2017-09-19 08:29:51

SSD壽命驅動器

2025-05-19 17:18:57

AI模型o3

2017-08-16 10:03:57

前端面試題算法

2019-04-30 14:48:12

前端面試React

2021-03-18 07:32:51

Java面試項目

2021-01-26 10:29:06

前端開發技術

2024-03-18 00:01:00

按鈕鏈接元素

2021-05-21 14:26:18

ObjectMap前端

2020-06-29 09:18:32

Python數據工具

2024-04-10 07:56:38

前端數組uniq
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文av电影 | 亚洲视频观看 | 久久久亚洲综合 | 在线看免费 | 午夜小电影 | 久久久av中文字幕 | 欧美一级全黄 | 精品视频一区在线 | 99久久婷婷国产综合精品电影 | 欧美aaaaaaaa| 国产日韩久久久久69影院 | 一区二区三区av | 欧美日产国产成人免费图片 | 黄a免费网络 | 色视频在线播放 | 国产精品久久久久久一级毛片 | 国产精品三级久久久久久电影 | 高清国产一区二区 | 国产一区二区三区在线看 | 国产伦精品一区二区三区照片91 | 国产视频久久久 | 91免费在线看| 欧美日韩国产精品一区二区 | 欧美精品一区二区三区在线播放 | 国内精品伊人久久久久网站 | 国产精品久久久久久影院8一贰佰 | 欧美精品久久久 | 午夜影院在线观看版 | 亚洲一区二区三区桃乃木香奈 | 免费观看成人av | 亚洲国产小视频 | 男人午夜视频 | 国产美女在线播放 | 最新黄色毛片 | 欧美亚洲国产一区 | 日本免费黄色一级片 | 欧美片网站免费 | 2021狠狠天天天 | 欧美一二三 | 久久国产一区二区三区 | 激情av免费看 |