教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!

开篇先致歉

其他不谈,开篇必须先给各位读者道个歉,年后工作上比较忙,加上最近闲暇的时间都用来在力扣上刷算法题了,导致公众号断更有些严重啊。再加上年后将健身减重提上了日程,时间上就更显的捉襟见肘了。
不过忙活一阵子还是有些收获的,减肥13斤,刷题80道+,虽然算法还在彩笔的边缘疯狂挣扎(然后挣扎不出去),但起码比之前要好很多了周赛四道题,一道简单和两道中等基本都可以AC,只是有时会第二道中等完成时考试已经结束了,哈哈。至于困难题么,再等等吧....
今天除了谈谈最近刷题的感想,就是给大家分享下,我是如何制作自己的力扣题解记录与电脑、手机markdown云笔记的,希望能对各位走在金三银四跳槽季,或者赶着提升算法的朋友们有所帮助。闲话少叙,直入正题。

为什么要重造轮子

首先,各大平台的笔记工具个人一直常用的是有道云笔记,但markdown文本的使用效果很不理想,而且针对markdown的页面间跳转很不方便,其实前面两句是废话,主要是会员比较贵。
作为一个白嫖党,而且个人的笔记都是和代码相关的,为什么不自己通过工具实现一个手机电脑可以同步的markdown云笔记呢?

工具依赖介绍

说到代码和同步,那么git仓库就顺应而来,唯一麻烦的是手机如何安装git并且能执行git pull/push等操作用来更新呢?那就要介绍下我之前给大家分享过的安卓手机Linux虚拟平台Termux了。
起初使用这个工具,是因为当时同时追好几本小说,然后免费小说网页浏览的时候总会推送那种难登大雅之堂的广告与图片,所以想想自己写个爬虫然后拿Termux安装Python每天中午跑一把,几本小说的更新不就推下来了么,边吃饭边白嫖,真香。
虽然手机这东西,作为开发者工具实在是有些鸡肋,但依赖Termux来实现git下载同步那简直不要太方便。Termux的介绍与使用,我就不过多赘述了,之前总结过一篇非常详尽的文章,大家可以去看看,传送门:

将安卓手机打造成你的python全栈开发利器

有了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效果

工具分享

Termux获取比较麻烦,默认下载的是链接工具,还需要初始化下载一堆依赖工具才能安装完成。手机没有墙获取很麻烦,在这里为大家准备好了完成的Termux安装包,提供大家下载,公众号 清风Python后台回复 Termux,即可获取完整安装包。
另外力扣刷题的文章同步到了我的个人博客,欢迎大家访问:
https://qingfengpython.cn/
也欢迎大家Fork我的git仓库共同学习:
https://github.com/BreezePython/AlgorithmMarkdown

之后文章

之后的一个月重点学习还在LeetCode算法刷题上,如果有喜欢刷题的朋友欢迎添加后台联系我,加我微信互相鼓励,共同进步。之后每天会更新关于力扣算法的文章,题目范围不仅限于每天力扣推荐的每日一题,还涉及各类算法,欢迎大家关注,或者留言一起讨论题解。今天的分享就到这里,希望大家喜欢。

结束语

期待你关注我的公众号清风Python,如果你觉得不错,希望能动动手指转发给你身边的朋友们。
我的个人博客地址:https://qingfengpython.cn/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 把你的手机变成一款真正的内容生产与发布工具。 场景 如果你平时喜欢记录与写作,那么以下的场景你很可能曾经遇到过: ...
    王树义阅读 6,079评论 7 52
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,562评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,216评论 1 3
  • 没事就多看看书,因为腹有诗书气自华,读书万卷始通神。没事就多出去旅游,别因为没钱而找借口,因为只要你省吃俭用,来...
    向阳之心阅读 4,783评论 3 11
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,983评论 2 7