前序
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 为 https://leetcode.com/problems/two-sum/description/ ,即将题名中间空格换为 '-' 即可,代码如下:
[$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 题解地址:https://github.com/starFalll/LeetCode