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

简介: 今天除了谈谈最近刷题的感想,就是给大家分享下,我是如何制作自己的力扣题解记录与电脑、手机markdown云笔记的,希望能对各位走在金三银四跳槽季,或者赶着提升算法的朋友们有所帮助。闲话少叙,直入正题。

今天除了谈谈最近刷题的感想,就是给大家分享下,我是如何制作自己的力扣题解记录与电脑、手机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效果




相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
8天前
|
存储 安全 关系型数据库
Blossom:开源私有部署的markdown笔记软件
Blossom 是一款功能强大的开源笔记软件,支持私有部署,可将笔记、图片、个人计划等数据保存在自己的服务器中,并实现实时同步。它还具备动态博客功能,方便记录和分享内容。Blossom 支持多种设备,提供完善的文件管理、快速迁移和丰富的附加功能,是个人知识管理和博客展示的理想选择。
32 7
Blossom:开源私有部署的markdown笔记软件
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
20天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
16 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
1月前
|
人工智能 自然语言处理 机器人
“今日热点:AI像人类一样使用手机和电脑”,魔搭社区的开源项目已先行一步
今天,Claude发布了Computer Use的新功能,可以让AI像人一样使用电脑!
|
1月前
新手编写markdown笔记一条龙
新手编写markdown笔记一条龙
31 0
|
1月前
|
Android开发 Swift iOS开发
python 基于电脑蓝牙连接获取手机的实时数据
python 基于电脑蓝牙连接获取手机的实时数据
53 0
|
2月前
|
自然语言处理 决策智能 Python
同时操控手机和电脑,100项任务,跨系统智能体评测基准有了
【9月更文挑战第9天】近年来,随着人工智能技术的进步,自主智能体的应用日益广泛。为解决现有评测基准的局限性,研究人员推出了CRAB(Cross-environment Agent Benchmark),这是一种支持跨环境任务的新框架,结合了基于图的精细评估方法和高效的任务构建机制。CRAB框架支持多种设备并可轻松扩展至任何具备Python接口的环境。首个跨平台基准CRAB-v0包含100项任务,实验显示GPT-4单智能体在完成率方面表现最佳。CRAB框架为智能体研究提供了新机遇,但也面临计算资源和评估准确性等方面的挑战。
71 9
|
3月前
|
Web App开发 Android开发
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
实时数据传输在互联网中至关重要,不仅支持即时通讯如QQ、微信的文字与图片传输,还包括音视频通信。一对一通信常采用WebRTC技术,如《Android Studio开发实战》中的App集成示例;而一对多的在线直播则需部署独立的流媒体服务器,使用如SRT等协议。SRT因其优越的直播质量正逐渐成为主流。本文档概述了SRT协议的使用,包括通过OBS Studio和SRT Streamer进行SRT直播推流的方法,并展示了推流与拉流的成功实例。更多细节参见《FFmpeg开发实战》一书。
63 1
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo