教你创建电脑、手机同步的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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值