「刷題專欄」起航 - 五分鐘構(gòu)建自己的刷題倉庫

thumb-1920-1120781

擁有自己的刷題倉庫能夠幫助自己記錄刷題歷程 & 刷題知識(shí),如果偶爾學(xué)習(xí)到新的解法還能夠補(bǔ)充記錄到之前的解法后面。Github 上搜索 leetcode 就能看到各種大神的 leetcode 刷題倉庫,準(zhǔn)備刷題的你也可以五分鐘擁有一個(gè)屬于自己的刷題倉庫.

一. 五分鐘構(gòu)建刷題倉庫

Step1. 構(gòu)建自己的刷題倉庫

使用倉庫的初始化分支 init 構(gòu)建自己的刷題倉庫,命令行執(zhí)行腳本如下:

# 克隆init分支的最新一次記錄
git clone -b init --depth=1 https://github.com/Nodreame/leetcode-js
cd leetcode-js
rm -rf .git # 刪掉原本的倉庫記錄,用自己的Git信息完成倉庫初始化
git init
git add .
git commit -m "init(project): first commit"

執(zhí)行過程如下所示:

image-20210110174644650

然后就可以自行上傳代碼到自己的 Github 啦~ 完成之后的倉庫大概是這樣的:

image-20210110173432084

Step2. 生成題目文件

做完第一步之后你可能覺得"這個(gè)倉庫根本沒有一點(diǎn)刷題倉庫的樣子"

image-20210110184607236

別急,現(xiàn)在開始使用預(yù)置好的生成邏輯來生成題目列表了~ 運(yùn)行如下命令:

npm i # 安裝依賴(或者 yarn)
npm run build-leetcode # 或者 yarn build-leetcode

運(yùn)行結(jié)果如下(這里我將題目生成的打印屏蔽了):

image-20210110175023570

然后查看項(xiàng)目目錄,可以看到剛剛已經(jīng)項(xiàng)目生成了 leetcode 文件夾,并且已經(jīng)為每道題生成了一個(gè)模板Markdown 文件:

image-20210110175212743

模板是根據(jù) dev 文件夾下的 template.md 文件生成的,可以根據(jù)自己的需求修改~

Step3. 更新題目

當(dāng)我們刷題一段時(shí)間后發(fā)現(xiàn), Leetcode 更新題目了!難道要新增的題目都只能手動(dòng)創(chuàng)建嗎?

結(jié)果明顯是否定的~ 每周 Leetcode 都會(huì)誕生新的題目,獲取到新題目的同時(shí),不影響現(xiàn)有刷題記錄就成為一件必要的事情了. 當(dāng)然這件事腳本也處理了~

525344c2d5628535e09f7f7087ef76c6a7ef6363

想要獲取新的題目的時(shí)候依舊直接使用 npm run build-leetcode 或者 yarn build-leetcode 更新題目即可:

image-20210110183120728

腳本會(huì)自動(dòng)對(duì)比舊題目和新增題目,然后生成新增題目的刷題模板:

image-20210110183412232

現(xiàn)在最簡版本的刷題倉庫已經(jīng)構(gòu)建完畢~ 是不是啪的一下很快就搞定了呢(馬老師直呼內(nèi)行

二. 腳本分析

刷題倉庫構(gòu)建后想要刷題的同學(xué)可以開刷了,當(dāng)然也可以繼續(xù)花多幾分鐘看看實(shí)現(xiàn)倉庫構(gòu)建能力的腳本是怎么編寫的.

我摘抄了一段主邏輯的代碼,并且在每個(gè)流程寫上注釋,如下所示:

async function main() {
 // 1\. 獲取最新 Leetcode 題目列表
  const problems = await getLeetcodeProblems()

  // 2\. 拿 "最新題目列表" 與 現(xiàn)有的"緩存列表"做 diff
  const cacheFolderName = 'cache'
  const cacheFileName = 'problems'
  const [ isInit, genProblems ] = diff(problems, cacheFolderName, cacheFileName)

  // 3\. 存在"待生成題目"時(shí)進(jìn)入題目文件生成邏輯
  if (genProblems.length > 0) {
    // 3.1 更新緩存文件
    saveCacheProblemsSync(`./${cacheFolderName}/${cacheFileName}.json`, problems)
    console.log(`題目緩存文件${ isInit ? '初始化創(chuàng)建' : '全量更新' }完成`)
    // 3.2 生成題目
    generateProblemFiles (genProblems, 'leetcode')
  }
}

之前有提到過,直接運(yùn)行該腳本既能初始化倉庫,又能對(duì)比得到需要更新的內(nèi)容生成對(duì)應(yīng)文件,那么是怎么做到的呢?讓我們來看看 diff 邏輯 及 最后生成題目的邏輯~

1. diff 邏輯

由于每次運(yùn)行腳本都會(huì)更新題目信息緩存文件(步驟 3.1),故當(dāng) Leetcode 出新題時(shí)可以拿"最新題目列表"與"緩存題目列表"進(jìn)行對(duì)比:

image-20210110211817332

創(chuàng)建一個(gè) Set 用來存儲(chǔ)緩存列表,然后使用 filter 來過濾出不屬于緩存列表的題目(用 Set.has 復(fù)雜度為 O(1) 而數(shù)組.indexOf 復(fù)雜度為 O(N)故選前者~). 這樣就可以實(shí)現(xiàn)腳本的 diff 能力啦~

2. 生成題目邏輯

腳本的 diff 能力依賴緩存文件,但是可能同學(xué)在操作過程中不小心把緩存文件刪了,如果腳本不做處理的話就可能會(huì)造成覆蓋,所以在生成題目這里加上了對(duì)已有文件判斷邏輯:

image-20210110212736471

對(duì)于有興趣了解細(xì)節(jié)的同學(xué)可以直接到 Github 倉庫中查看腳本邏輯,路徑為:https://github.com/Nodreame/leetcode-js/blob/init/dev/generateProblemsFile.js

撒花??ヽ(°▽°)ノ?

歡迎拍磚,覺得還行也歡迎點(diǎn)贊收藏~
新開公號(hào):「無夢的冒險(xiǎn)譚」歡迎關(guān)注(搜索 Nodreame 也可以~)
旅程正在繼續(xù) ??ヽ(°▽°)ノ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容