前序
Leetcode 做了很多道了,沒怎麼整理,只是每道題對應一個markdown題解檔案,Leetcode專案倉庫裡面呈現方式是這樣的:
可以看出結構很混亂,所以 ACool 想做一個索引放在 README 裡面。像這樣:
按照題號排序,中間是題目名稱和題目的 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=***
意思是字串全部轉為小寫賦值給變數。
最後分別有三列,對應第二張圖中的三列:
-
第一列取題號,
${varible%%string*}
表示從右向左擷取變數中最後一個 string 後的字串,這裡便是取 題號.題名.md 中的 題號 ,程式碼如下:${line%%.*} 複製程式碼
-
第二列由題名得到 leetcode 中對應的題目描述的地址,例如 Leetcode第一道題名為 Two Sum ,對應的 url 為 leetcode.com/problems/tw… ,即將題名中間空格換為 '-' 即可,程式碼如下:
[$title](https://leetcode.com/problems/algorithms/url//' '/'-'}/description/) 複製程式碼
-
第三列表示題解地址,因為 url 會將空格轉換成
%20
,所以這裡將空格換成%20
即可,程式碼如下:[C++](https://github.com/starFalll/LeetCode/blob/master/algorithms/${line//' '/'%20'}) 複製程式碼
然後將這一行索引重定向到 README.md 檔案裡面便完成了索引的生成。
結果和第二張圖一樣:
更新索引指令碼
雖然整理好了索引,但是因為剩下的題不是按照順序刷的,新題的索引如何插入解決呢?手動也很麻煩,可以將之前的索引生成指令碼更改一下,變成更新索引指令碼。程式碼如下:
#! /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
:
用指令碼整理檔案真的很方便,各位讀者也可以嘗試一下。
附上 ACool 的 Leetcode 題解地址:github.com/starFalll/L…