leetcode

module
v0.0.0-...-9b92ec5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 3, 2021 License: MIT

README

leetcode

leetcode 本地化题库,有本地刷题/测试/调试/书签/题解记录等功能

在线执行 golang 代码跑算法,可以使用 Golang 在线代码执行: https://runcode.6cm.co/go

本项目只包含问题及原始网站提供的代码片断,想看题解及代码实现的可查看源站题解或者:LeetCode-Go

本地刷题及单步调试算法、保留所有题解及查看解答变迁是本仓库存在的意义。

使用示例: usage

Intro

本仓库是 leetcode-cn.com 本地化题库,包含本地化测试用例、常用 go 工具包的一个仓库。

本仓库主要包含三个功能:

  • leetcode 在线题目本地化 (questions 目录)
  • 本地化测试用例,本地调试 (cmd 目录)
  • 常用刷题 go 语言工具包 (utils 目录)
  • 保存题解,随时查看历史 (./leetcode solution 命令)

须知

  • 抱着怀疑的心态使用测试用例(当然每个测试用例都经过精心测试,但难免会有意外)
  • 每次执行测试时会先运行一次,检测是否会超时,超时默认为2s
  • 当前所有测试用例共用一个运行环境,需考虑算法是否会对此有特殊要求(也就是说,你写的算法块最好是无状态的,注意:全局变量会在每个测试用例间共享)
  • 开始你的算法之旅
  • 所有包含路径的部分在 goland/idea 编辑器控制台可以直接点击跳转到代码,省去找算法目录的过程

安装

git --depth 1 clone https://github.com/gladmo/leetcode.git
cd leetcode
go build -o leetcode cmd/leetcode.go
./leetcode

# or
go install cmd/leetcode.go
leetcode

主要功能

本地化测试
./leetcode test 133
# or
./leetcode test clone-graph
# or 
./leetcode test https://leetcode-cn.com/problems/clone-graph/

可以得到测试结果:

+------+--------------------------------+----------+----------+
| 序号  |            用例名称             | 测试状态  | 失败原因  |
+------+--------------------------------+----------+----------+
| 1/4  | test-nil                       | PASS     |          |
| 2/4  | test-empty                     | PASS     |          |
| 3/4  | test-[[2],[1]]                 | PASS     |          |
| 4/4  | test-[[2,4],[1,3],[2,4],[1,3]] | PASS     |          |
+------+--------------------------------+----------+----------+
本地化 leetcode-cn.com 题目
./leetcode get 133
# or
./leetcode get clone-graph
# or 
./leetcode get https://leetcode-cn.com/problems/clone-graph/

得到输出:

+----------+------------------------------+
| 标题      | Clone Graph                  |
+----------+------------------------------+
| 问题ID    |                          133 |
+----------+------------------------------+
| 中文标题  | 克隆图                        |
+----------+------------------------------+
| 标签      | 深度优先搜索,广度优先搜索,图     |
+----------+------------------------------+
| 难度      | medium                         |
+----------+------------------------------+

所有你使用 ./leetcode test ... 测试过的代码,都会保存到当前目录 solutions.db

可以使用 ./leetcode solution list 列出所有解答:

./leetcode solution list

得到类似如下输出:

+--------+----------------------+------+--------+----------+------------+------------+
| 问题ID |         标题         | 难度 | 版本数 | 测试次数 |  首次提交  |  最后提交  |
+--------+----------------------+------+--------+----------+------------+------------+
|   1786 | 统计一致字符串的数目 | easy |      1 |        0 | 2020-12-13 | 2020-12-13 |
+--------+----------------------+------+--------+----------+------------+------------+
|    283 | 移动零               | easy |      1 |        0 | 2020-12-13 | 2020-12-13 |
+--------+----------------------+------+--------+----------+------------+------------+

获取某一题下所有测试过的题解:

./leetcode solution get 283

得到类似以下输出:

+------+--------+----------+------+--------+------------+------+
| 序号 |  语言  | 测试次数 | 评价 |  消耗  |  创建时间  | 备注 |
+------+--------+----------+------+--------+------------+------+
|    1 | golang |        0 | 6/6  | 1.387s | 2020-12-13 |      |
+------+--------+----------+------+--------+------------+------+

查看提交的题解代码部分:

./leetcode solution code 283 1
func moveZeroes(nums []int) {
        var j int
        for i := 0; i < len(nums); i++ {
                if nums[i] != 0 {
                        nums[j], nums[i] = nums[i], nums[j]
                        j++
                }
        }
}

查看题解详情:

./leetcode solution describe 283 1
+-------+---------------------------------------------------------------+
| 编号: |                                                           283 |
+-------+---------------------------------------------------------------+
| 题目: | 移动零                                                        |
+-------+---------------------------------------------------------------+
| 难度: | easy                                                          |
+-------+---------------------------------------------------------------+
| 语言: | golang                                                        |
+-------+---------------------------------------------------------------+
| 路径: | questions/serial/easy/283/golang/solution/move-zeroes.go:11:1 |
+-------+---------------------------------------------------------------+
| 时间: | 2020-12-13                                                    |
+-------+---------------------------------------------------------------+
代码:
func moveZeroes(nums []int) {
        var j int
        for i := 0; i < len(nums); i++ {
                if nums[i] != 0 {
                        nums[j], nums[i] = nums[i], nums[j]
                        j++
                }
        }
}

将代码检出到问题中:

./leetcode solution checkout 283 1

题目: 移动零, 编号: 283, 代码检出成功。
路径: questions/serial/easy/283/golang/solution/move-zeroes.go:11:1

代码检出后,将会使用历史的题解覆盖当前题目代码,方便回顾之前写算法的过程。

Q & A

Q: 为何会有这个仓库?
A: 刚开始刷题后发觉大部分时间花在了构造测试用例上,我觉得这个是可以大家共享的。而在本地可以跑测试,
对于解错题时的逐行调试代码尤为重要,对于加深对算法的理解会有帮助。

Q: 为何现在只有 golang 的测试用例?
A: 本仓库是为了我辅助刷题使用,欢迎其它语言刷题者提 PR 丰富仓库。

Q: 为何仓库的题目不全?
A: 虽然可以使用 ./leetcode get ... 将题目全本地化,虽然工具已经很完善可以生成大部分
的 golang 代码,但是所有测试用例还需要手动来创建。我在努力刷题中,每刷过的题目都会将测
试用例一并更新到仓库中。欢迎大家一起贡献你的测试用例。

Q: 我是刷题者,这个仓库对我有何作用?
A: 首先,如果你使用 golang 刷题时,按题号检索时, questions/serial 目录包含了 简单/中等/困难 
三个层次的问题,你可以选择题号做题。按标签刷题的朋友可以在 questions/tags 找到不同标签的题目,
注意在测试的时候,需要使用 (leetcode test --tag [you-choose-tag] ... )
需要带上 --tag  [you-choose-tag]

Q: Goland 控制台输出的链接太难识别了怎么办?
A: 可以到 Editor -> Color Scheme -> General -> Hyperlinks -> Reference 调整配色

Q: 为何我的idea控制台中路径不能点击?
A: 首次get题目时,编辑器还未加载到文件,点一下目录,再试试一次 info 命令即可

Q: 我想贡献代码,我应该怎么做?
A: 首先感谢你对项目的支持。
1. 现有问题 markdown 或者测试用例修改
已有问题文件夹下的 README.md(问题 markdown 文件) 或问题下的golang文件夹中的 main.go(测试用例),
提交前使用 leetcode clear 将 solution 代码复原,!!!这个操作会将 serial 目录下的所有 solution 
目录下的代码恢复到与 leetcode-cn.com 提供的代码片断一致(这么做的目录是为了给刷题者创建一个原生的刷题环境,
而且大家写的代码在 solution 也会反复覆盖)

2. 与 leetcode-cn.com 交互代码部分可在 leet 目录修改
3. leetcode 命令行问题可在 cmd/command 目录修改
4. 添加刷题工具库的可以添加到 utils 目录下,添加前需要先确认功能还不存在。

再次感谢!
命令功能简介:
leetcode cli

Usage:
  leetcode [command]

Available Commands:
  backup      backup you complete questions to solutions
  base        clear & replace all question use you specified (backup all unbanked)
  clear       set questions to default (backup all unbanked)
  completion  Generate completion script
  get         get leetcode question from leetcode-cn.com
  help        Help about any command
  info        print leetcode question info
  solution    题解管理
  test        测试本地代码,保存题解
  version     Print the version number of leetcode cli

Flags:
  -h, --help   help for leetcode

Use "leetcode [command] --help" for more information about a command.

本仓库是作者刷题目过程中不断完善的一个仓库,后续投入开发的时间将会减少,一起刷题目的小伙伴可以一起来贡献你的测试用例。

如果你是一名刷题者

你只需要使用:

leetcode test ... 解答完问题,跑测试用例

+------+--------------------------------+----------+----------+
| 序号  |            用例名称             | 测试状态  | 失败原因  |
+------+--------------------------------+----------+----------+
| 1/4  | test-nil                       | PASS     |          |
| 2/4  | test-empty                     | PASS     |          |
| 3/4  | test-[[2],[1]]                 | PASS     |          |
| 4/4  | test-[[2,4],[1,3],[2,4],[1,3]] | PASS     |          |
+------+--------------------------------+----------+----------+

leetcode info ... 查看问题基础信息

+----------+------------------------------+
| 标题      | Clone Graph                  |
+----------+------------------------------+
| 问题ID    |                          133 |
+----------+------------------------------+
| 中文标题  | 克隆图                        |
+----------+------------------------------+
| 标签      | 深度优先搜索,广度优先搜索,图     |
+----------+-----------------------------+
| 难度      | medium                         |
+----------+------------------------------+
如果你是一名贡献者
首先感谢你对项目的支持。
1. 现有问题 markdown 或者测试用例修改
已有问题文件夹下的 README.md(问题 markdown 文件) 或问题下的golang文件夹中的 main.go(测试用例),
提交前使用 leetcode clear 将 solution 代码复原,!!!这个操作会将 serial 目录下的所有 solution 
目录下的代码恢复到与 leetcode-cn.com 提供的代码片断一致(这么做的目录是为了给刷题者创建一个原生的刷题环境,
而且大家写的代码在 solution 也会反复覆盖)

2. 与 leetcode-cn.com 交互代码部分可在 leet 目录修改
3. leetcode 命令行问题可在 cmd/command 目录修改
4. 添加刷题工具库的可以添加到 utils 目录下,添加前需要先确认功能还不存在。

再次感谢!

Changelog

2020-12-15
  • questions 目录下的两个json文件改用 bolt 存储
2020-12-14
  • leetcode mark 命令,可以给问题或者题解设置书签
2020-12-13
  • leetcode solution 命令,使用测试时保存的所有题解都可以用此命令及其子命令查看
  • leetcode backup 命令

Todo

  • leetcode search 命令
  • leetcode login
  • leetcode publish

Directories

Path Synopsis
cmd
questions
str

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL