今天除了谈谈最近刷题的感想,就是给大家分享下,我是如何制作自己的力扣题解记录与电脑、手机markdown云笔记的,希望能对各位走在金三银四跳槽季,或者赶着提升算法的朋友们有所帮助。闲话少叙,直入正题。
为什么要重造轮子
首先,各大平台的笔记工具个人一直常用的是有道云笔记,但markdown文本的使用效果很不理想,而且针对markdown的页面间跳转很不方便,其实前面两句是废话,主要是会员比较贵。
作为一个白嫖党,而且个人的笔记都是和代码相关的,为什么不自己通过工具实现一个手机电脑可以同步的markdown云笔记呢?
工具依赖介绍
说到代码和同步,那么git仓库就顺应而来,唯一麻烦的是手机如何安装git并且能执行git pull/push等操作用来更新呢?那就要介绍下我之前给大家分享过的安卓手机Linux虚拟平台Termux了。
起初使用这个工具,是因为当时同时追好几本小说,然后免费小说网页浏览的时候总会推送那种难登大雅之堂的广告与图片,所以想想自己写个爬虫然后拿Termux安装Python每天中午跑一把,几本小说的更新不就推下来了么,边吃饭边白嫖,真香。
虽然手机这东西,作为开发者工具实在是有些鸡肋,但依赖Termux来实现git下载同步那简直不要太方便。Termux的介绍与使用,我就不过多赘述了,之前总结过一篇非常详尽的文章,大家可以去看看,传送门:
有了git,电脑手机分别下载一个markdown读写工具我们的云笔记就ok了。电脑上比较推荐Typora,网上介绍一大把,下载用就对了,好不好用过就知道了。
但手机端该使用什么markdown工具呢?这个研究的过程持续了很久。试过了十几款markdown工具,都存在或多或少的问题,其中最麻烦的是,很多工具的都不支持直接读取手机固定目录的markdown历史文件。这很头大。最终选定了一款Markor的编辑器,它能支持本地目录导入,而且阅读展示效果很不错。
可是,工具就和咱们买书一样,折腾到手了,不看不用也是白搭,那么今天就教大家在日常刷力扣的同时,总结解题并且创建手机、电脑同步的markdown云笔记,方便我们在闲暇之余,复习之前刷过的内容。先看看手机云笔记的最终形态吧!
手机同步
力扣刷题模板
既然要用markdown写力扣解题,就要谈谈力扣刷题的模板了。先来看看我当前刷题的目录和使用的刷题记录模板:
代码结构目录
刷题模板
很多人会问,刷题只管做题就行了,费这么大劲又是弄模板、又是写笔记的,有什么用?起初我也是这么想的,疯狂刷量就行了,做什么笔记。然后,有天随手翻到之前做过的题,竟然一时半会想不起来当时的解题思路,瞬间脑中环绕一句:“学而时习之,不亦说乎!”如果你只是短时间做几道题,可能没有太深刻的感觉,如果你连着做了一两个月,然后突然回头看之前费过一番劲才做出来的题,你就深有体会了。
那么只是一篇篇的做笔记,这样看起来不是很麻烦吗?既然是给大家分享,当然是我觉得这个方法不错才会提出来了!
既然我们每篇文章都是固定的模板,那么我们是否可以写一个批量读取目录和刷题文件内容的代码,快速的为我们创建一个已完成的题目表格呢?of course!
代码改变世界
markdown的创建表格是不需要单独引入插件的,并且它的表格自适应布局功能很强,如果不是强迫症终结者,那原生的表格样式就满足我们的审美了,比如这样:
解题记录表格
这里顺口说一句,GitHub年后更新的深色模式,真是我这种夜猫子的大爱啊....
这里看下我们的表格,编号列没啥说的循环追加即可,分类字段我们通过文件夹名称即可获取,题目、难度、力扣解题链接在每个解题文件里都能通过正则匹配到,麻烦的可能就是我的解题,需要定位相对路径了。但好在README.md在git仓库的根目录,目录匹配会简单一些。
接下来说说自动实现的代码吧:
# -*- coding: utf-8 -*- # @Author : 王翔 # @微信号 : King_Uranus # @公众号 : 清风Python # @GitHub : https://github.com/BreezePython # @Date : 2021/03/28 18:40:04 # @Software : PyCharm # @version :Python 3.7.3 # @File : algorithm_markdown_table.py import os import re # 基础模板头,个人自定义 MARKDOWN_TABLE_TEMPLATE = """ # Algorithm coding practice with Python3. > https://github.com/BreezePython/AlgorithmMarkdown 欢迎关注我的公众号: **清风Python** 我的个人博客:[https://qingfengpython.cn](https://qingfengpython.cn) | 编 号 | 分 类 | 题 目 | 难 度 | 我的解题 | 力扣题目链接 | | ----- | ----- | ---- | ---- | ------ | -------- | """ class MakeAlgorithmMarkdownTable: def __init__(self, search_path, excludes): self.search_path = search_path self.start_dirname = os.path.basename(self.search_path) self.excludes = excludes self.programs = [] def dfs_markdown_path(self, path): for child in os.listdir(path): if child.lower() in self.excludes: continue markdown_link_dir = path[path.find(self.start_dirname):].replace('\\', '/') if os.path.isfile(os.path.join(path, child)): markdown_link_path = '/'.join([markdown_link_dir, child]) self.get_code_table(path, child, markdown_link_path) else: self.dfs_markdown_path(os.path.join(path, child)) def get_code_table(self, file_path, file_name, abs_path): algorithm_type = os.path.split(file_path)[-1].strip('_') code_file_name = os.path.splitext(file_name)[0] git_file_link = f"[{code_file_name}]({abs_path})" level = None link = None with open(os.path.join(file_path, file_name), 'r', encoding='utf-8') as f: for i in range(10): info = f.readline().strip() get_level = re.match('>.*难度[:|:]', info) if get_level: # 正则获取解析的span尾节点 level = info[get_level.span()[1]:] # 获取力扣题目链接 get_link = re.match('.*https://leetcode-cn.com', info) if get_link: link = info[get_link.span()[0]:].strip('> ') self.programs.append([algorithm_type, code_file_name, level, git_file_link, f'[点击跳转]({link})']) @staticmethod def sort_title(title): title = title.split('.')[0].strip() if title.isdigit(): return int(title) return 1000 def run(self): self.dfs_markdown_path(self.search_path) self.programs.sort(key=lambda x: self.sort_title(x[1])) with open(os.path.join(os.path.dirname(self.search_path), "README.md"), 'w', encoding='utf-8') as readme_file: readme_file.write(MARKDOWN_TABLE_TEMPLATE) for index, info in enumerate(self.programs, start=1): readme_file.write("|{}|{}|{}|{}|{}|{}|\n".format(index, *info)) if __name__ == '__main__': # 历史算法解题目录 MARKDOWN_PATH = r'D:\AlgorithmMarkdown\Leetcode' # 例外文件列表 EXCLUDE_FILES = ['readme.md', '力扣算法刷题目录.md'] m = MakeAlgorithmMarkdownTable(MARKDOWN_PATH, EXCLUDE_FILES) m.run()
来看看效果自动生成的markdown效果,完美!
README.md效果