用指令碼整理Leetcode題解

ACool發表於2018-10-20

原文地址:blogof33.com/post/17/

前序

Leetcode 做了很多道了,沒怎麼整理,只是每道題對應一個markdown題解檔案,Leetcode專案倉庫裡面呈現方式是這樣的:

shell01.png

可以看出結構很混亂,所以 ACool 想做一個索引放在 README 裡面。像這樣:

shell02.png

按照題號排序,中間是題目名稱和題目的 Leetcode 連結,最後是題解語言和連結。按照這樣的結構來手動一條一條整理,實在是太花時間了,所以 ACool 寫了一個索引生成 shell script 來整理。

索引生成指令碼

指令碼的程式碼如下:

#! /bin/bash
ls | grep '^[0-9]'|sort -n|while read line
do
    title=`echo ${line}|cut -d . -f 2`
    declare -l url=${title}
    echo "|${line%%.*}|[$title](https://leetcode.com/problems/algorithms/url//' '/'-'}/description/)|[C++](https://github.com/starFalll/LeetCode/blob/master/algorithms/${line//' '/'%20'})|" >>README.md 
done
複製程式碼

解釋一下,如第一張圖所示,所有題解檔案都是(題號.題名.md)的形式,所以第一行程式碼按照題號對其進行排序,從小到大,將排序的結果按行取出。一行一行處理。 然後是一個迴圈,每行(即每個題解檔案)先取中間的題名儲存在 title 變數裡,再將其所有字母小寫的內容儲存在 url 中,注意這裡 declare -l varible=*** 意思是字串全部轉為小寫賦值給變數。 最後分別有三列,對應第二張圖中的三列:

  1. 第一列取題號,${varible%%string*} 表示從右向左擷取變數中最後一個 string 後的字串,這裡便是取 題號.題名.md 中的 題號 ,程式碼如下:

    ${line%%.*}
    複製程式碼
  2. 第二列由題名得到 leetcode 中對應的題目描述的地址,例如 Leetcode第一道題名為 Two Sum ,對應的 url 為 leetcode.com/problems/tw… ,即將題名中間空格換為 '-' 即可,程式碼如下:

    [$title](https://leetcode.com/problems/algorithms/url//' '/'-'}/description/)
    複製程式碼
  3. 第三列表示題解地址,因為 url 會將空格轉換成 %20 ,所以這裡將空格換成 %20 即可,程式碼如下:

    [C++](https://github.com/starFalll/LeetCode/blob/master/algorithms/${line//' '/'%20'})
    複製程式碼

然後將這一行索引重定向到 README.md 檔案裡面便完成了索引的生成。

結果和第二張圖一樣:

shell02.png

更新索引指令碼

雖然整理好了索引,但是因為剩下的題不是按照順序刷的,新題的索引如何插入解決呢?手動也很麻煩,可以將之前的索引生成指令碼更改一下,變成更新索引指令碼。程式碼如下:

#! /bin/bash
for num in $*
do
    all=$(ls algorithms|sort -n)
    line=$(echo "${all}"|grep -n "^${num}\..*")
    echo "${line}"
    title=`echo ${line}|cut -d . -f 2`
    declare -l url=${title}
    newline=$(echo ${line}| cut -d : -f 2)
    declare -i num=$(echo ${line}|cut -d : -f 1)
    res=$(echo "|${newline%%.*}|[$title](https://leetcode.com/problems/${url//' '/'-'}/description/)|[C++](https://github.com/starFalll/LeetCode/blob/master/algorithms/${newline//' '/'%20'})|")
    num=num+6
    sed -i ''${num}'i\'"${res}"'' README.md
done
複製程式碼

傳入的引數為新題的題號,用迴圈一個一個處理,將新題加入排序中找到其順序,然後插入之前的索引即可。最後一行程式碼:

sed -i ''${num}'i\'"${res}"'' README.md
複製程式碼

其中 sed 是流編輯器,按行處理,將結果插入索引中。

指令碼使用的方式如下,即圖中的 newindex.sh

shell.png

用指令碼整理檔案真的很方便,各位讀者也可以嘗試一下。

附上 ACool 的 Leetcode 題解地址:github.com/starFalll/L…

相關文章