Collect from 追梦人物的博客
Modified by ACool

用脚本整理Leetcode

前序

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%%.*}
  1. 第二列由题名得到 leetcode 中对应的题目描述的地址,例如 Leetcode第一道题名为 Two Sum ,对应的 url 为 https://leetcode.com/problems/two-sum/description/ ,即将题名中间空格换为 '-' 即可,代码如下:
[$title](https://leetcode.com/problems/algorithms/${url//' '/'-'}/description/)
  1. 第三列表示题解地址,因为 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 题解地址:https://github.com/starFalll/LeetCode