Skip to content

Commit c132cab

Browse files
committed
add leetcode cli, update questions
1 parent a837232 commit c132cab

File tree

250 files changed

+18738
-14528
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

250 files changed

+18738
-14528
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@
1414
# Dependency directories (remove the comment below to include it)
1515
# vendor/
1616

17+
leetcode
18+
/solutions/
1719
questions/all_problems.json

README.md

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,176 @@
11
# leetcode
22
leetcode 本地化刷题/测试/上传
3+
4+
在线执行 golang 代码跑算法,可以使用
5+
[Golang 在线代码执行](https://runcode.6cm.co/go): https://runcode.6cm.co/go
6+
7+
## Intro
8+
本仓库是第三方 [`leetcode-cn.com`](https://leetcode-cn.com) 本地化题库,包含本地化测试用例、常用工具包的一个 go 仓库。
9+
10+
本仓库主要包含三个功能:
11+
12+
- leetcode 在线题目本地化 (questions 目录)
13+
- 本地化测试用例,本地调试 (cmd 目录)
14+
- 常用刷题 go 语言工具包 (utils 目录)
15+
16+
## 主要功能
17+
### 本地化测试
18+
```shell script
19+
./leetcode test 133
20+
# or
21+
./leetcode test clone-graph
22+
# or
23+
./leetcode test https://leetcode-cn.com/problems/clone-graph/
24+
```
25+
26+
可以得到测试结果:
27+
```shell script
28+
+------+--------------------------------+----------+----------+
29+
| 序号 | 用例名称 | 测试状态 | 失败原因 |
30+
+------+--------------------------------+----------+----------+
31+
| 1/4 | test-nil | PASS | |
32+
| 2/4 | test-empty | PASS | |
33+
| 3/4 | test-[[2],[1]] | PASS | |
34+
| 4/4 | test-[[2,4],[1,3],[2,4],[1,3]] | PASS | |
35+
+------+--------------------------------+----------+----------+
36+
```
37+
38+
### 本地化 leetcode-cn.com 题目
39+
```shell script
40+
./leetcode get 133
41+
# or
42+
./leetcode get clone-graph
43+
# or
44+
./leetcode get https://leetcode-cn.com/problems/clone-graph/
45+
```
46+
47+
得到输出:
48+
```shell script
49+
+----------+------------------------------+
50+
| 标题 | Clone Graph |
51+
+----------+------------------------------+
52+
| 问题ID | 133 |
53+
+----------+------------------------------+
54+
| 中文标题 | 克隆图 |
55+
+----------+------------------------------+
56+
| 标签 | 深度优先搜索,广度优先搜索,图 |
57+
+----------+------------------------------+
58+
| 难度 | 中等 |
59+
+----------+------------------------------+
60+
```
61+
62+
## Q & A
63+
```
64+
Q: 为何会有这个仓库?
65+
A: 刚开始刷题后发觉大部分时间花在了构造测试用例上,我觉得这个是可以大家共享的。而在本地可以跑测试,
66+
对于解错题时的逐行调试代码尤为重要,对于加深对算法的理解会有帮助。
67+
68+
Q: 为何现在只有 golang 的测试用例?
69+
A: 本仓库是为了我辅助刷题使用,欢迎其它语言刷题者提 PR 丰富仓库。
70+
71+
Q: 为何仓库的题目不全?
72+
A: 虽然可以使用 ./leetcode get ... 将题目全本地化,虽然工具已经很完善可以生成大部分
73+
的 golang 代码,但是所有测试用例还需要手动来创建。我在努力刷题中,每刷过的题目都会将测
74+
试用例一并更新到仓库中。欢迎大家一起贡献你的测试用例。
75+
76+
Q: 我是刷题者,这个仓库对我有何作者?
77+
A: 首先,如果你使用 golang 刷题时,按题号检索时, questions/serial 目录包含了 简单/中等/困难
78+
三个层次的问题,你可以选择题号做题。按标签刷题的朋友可以在 questions/tags 找到不同标签的题目,
79+
注意在测试的时候,需要使用 (leetcode test --tag [you-choose-tag] ... )
80+
需要带上 --tag [you-choose-tag]
81+
82+
Q: 我想贡献代码,我应该怎么做?
83+
A: 首先感谢你对项目的支持。
84+
1. 现有问题 markdown 或者测试用例修改
85+
现有代码修改 question.md(问题 markdown 文件) 或 main.go(测试用例),
86+
提交前使用 leetcode clear 将 solution 代码复原,!!!这个操作会将 serial 目录下的所有 solution
87+
目录下的代码恢复到与 leetcode-cn.com 提供的代码片断一致(这么做的目录是为了给刷题者创建一个原生的刷题环境,
88+
而且大家写的代码在 solution 也会反复覆盖)
89+
90+
2. 与 leetcode-cn.com 交互代码部分可在 leet 目录修改
91+
3. leetcode 命令行问题可在 cmd/command 目录修改
92+
4. 添加刷题工具库的可以添加到 utils 目录下,添加前需要先确认功能还不存在。
93+
94+
再次感谢!
95+
```
96+
97+
## 快速开始
98+
```shell script
99+
git --depth 1 clone https://github.com/gladmo/leetcode.git
100+
cd leetcode
101+
go build -o leetcode cmd/leetcode.go
102+
./leetcode
103+
```
104+
105+
你可以看到如下输出
106+
```shell script
107+
leetcode cli
108+
109+
Usage:
110+
leetcode [command]
111+
112+
Available Commands:
113+
base clear & replace all question use you specified
114+
clear set questions to default
115+
get get leet question from leet-cn.com
116+
help Help about any command
117+
info print leet question info
118+
test test you code and analyse
119+
version Print the version number of leetcode cli
120+
121+
Flags:
122+
-h, --help help for leetcode
123+
124+
Use "leetcode [command] --help" for more information about a command.
125+
```
126+
127+
本仓库是作者刷题目过程中不断完善的一个仓库,后续投入开发的时间将会减少,一起刷题目的小伙伴可以一起来贡献你的测试用例。
128+
### 如果你是一名刷题者
129+
130+
你只需要使用:
131+
132+
`leetcode test ...` 解答完问题,跑测试用例
133+
```shell script
134+
+------+--------------------------------+----------+----------+
135+
| 序号 | 用例名称 | 测试状态 | 失败原因 |
136+
+------+--------------------------------+----------+----------+
137+
| 1/4 | test-nil | PASS | |
138+
| 2/4 | test-empty | PASS | |
139+
| 3/4 | test-[[2],[1]] | PASS | |
140+
| 4/4 | test-[[2,4],[1,3],[2,4],[1,3]] | PASS | |
141+
+------+--------------------------------+----------+----------+
142+
```
143+
144+
`leetcode info ...` 查看问题基础信息
145+
```shell script
146+
+----------+------------------------------+
147+
| 标题 | Clone Graph |
148+
+----------+------------------------------+
149+
| 问题ID | 133 |
150+
+----------+------------------------------+
151+
| 中文标题 | 克隆图 |
152+
+----------+------------------------------+
153+
| 标签 | 深度优先搜索,广度优先搜索,图 |
154+
+----------+------------------------------+
155+
| 难度 | 中等 |
156+
+----------+------------------------------+
157+
```
158+
159+
### 如果你是一名贡献者
160+
```shell script
161+
A: 首先感谢你对项目的支持。
162+
1. 现有问题 markdown 或者测试用例修改
163+
现有代码修改 question.md(问题 markdown 文件) 或 main.go(测试用例),
164+
提交前使用 leetcode clear 将 solution 代码复原,!!!这个操作会将 serial 目录下的所有 solution
165+
目录下的代码恢复到与 leetcode-cn.com 提供的代码片断一致(这么做的目录是为了给刷题者创建一个原生的刷题环境,
166+
而且大家写的代码在 solution 也会反复覆盖)
167+
168+
2. 与 leetcode-cn.com 交互代码部分可在 leet 目录修改
169+
3. leetcode 命令行问题可在 cmd/command 目录修改
170+
4. 添加刷题工具库的可以添加到 utils 目录下,添加前需要先确认功能还不存在。
171+
172+
再次感谢!
173+
```
174+
175+
## TODO
176+
[ ] leetcode backup 命令

cmd/command/backup.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package command
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"github.com/spf13/cobra"
8+
)
9+
10+
var backupCmd = &cobra.Command{
11+
Use: "backup [question_id|leetcode_url]",
12+
Short: "backup you complete questions to solutions",
13+
Long: "恢复所有问题为默认状态,并将 serial 目录的所有问题覆盖到 tag 目录下",
14+
Run: func(cmd *cobra.Command, args []string) {
15+
if len(args) > 1 {
16+
cmd.Println("参数异常")
17+
cmd.Help()
18+
os.Exit(1)
19+
return
20+
}
21+
22+
fmt.Println("功能开发中...")
23+
24+
// if len(args) == 1 {
25+
// param := leet.Parse(strings.TrimSpace(args[0]))
26+
//
27+
// withDetail, err := cmd.PersistentFlags().GetBool("with-detail")
28+
// if err != nil {
29+
// fmt.Println(err.Error())
30+
// }
31+
//
32+
// info := leet.GetQuestionInfo(param)
33+
// info.Print(withDetail)
34+
//
35+
// for idx, dir := range info.SaveDir {
36+
// for _, language := range info.Languages {
37+
// err = leet.ToBeClear{
38+
// Dir: dir,
39+
// Language: language,
40+
// }.Clear()
41+
// if err != nil {
42+
// fmt.Println(err.Error())
43+
// }
44+
// }
45+
//
46+
// if idx > 0 {
47+
// err = leet.CopyDirectory(info.SaveDir[0], info.SaveDir[idx])
48+
// if err != nil {
49+
// fmt.Println(err.Error())
50+
// }
51+
// }
52+
// }
53+
//
54+
// } else {
55+
// titles := leet.GetAllQuestionTitleSlug()
56+
//
57+
// for _, title := range titles {
58+
// info := leet.GetQuestionInfo(title)
59+
// for idx, dir := range info.SaveDir {
60+
// for _, language := range info.Languages {
61+
// err := leet.ToBeClear{
62+
// Dir: dir,
63+
// Language: language,
64+
// }.Clear()
65+
// if err != nil {
66+
// fmt.Println(err.Error())
67+
// }
68+
// }
69+
//
70+
// if idx > 0 {
71+
// err := leet.CopyDirectory(info.SaveDir[0], info.SaveDir[idx])
72+
// if err != nil {
73+
// fmt.Println(err.Error())
74+
// }
75+
// }
76+
// }
77+
// }
78+
// }
79+
80+
},
81+
}
82+
83+
func init() {
84+
backupCmd.PersistentFlags().Bool("with-detail", false, "with-detail")
85+
}

cmd/command/base.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package command
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
8+
"github.com/spf13/cobra"
9+
10+
"github.com/gladmo/leetcode/leet"
11+
)
12+
13+
var baseCmd = &cobra.Command{
14+
Use: "base [question_id|leetcode_url]",
15+
Short: "clear & replace all question use you specified",
16+
Long: "恢复所有问题为默认状态,并将 serial 目录的所有问题覆盖到 tag 目录下",
17+
Run: func(cmd *cobra.Command, args []string) {
18+
if len(args) > 1 {
19+
cmd.Println("参数异常")
20+
cmd.Help()
21+
os.Exit(1)
22+
return
23+
}
24+
25+
if len(args) == 1 {
26+
param := leet.Parse(strings.TrimSpace(args[0]))
27+
28+
withDetail, err := cmd.PersistentFlags().GetBool("with-detail")
29+
if err != nil {
30+
fmt.Println(err.Error())
31+
}
32+
33+
info := leet.GetQuestionInfo(param)
34+
info.Print(withDetail)
35+
36+
for idx, dir := range info.SaveDir {
37+
for _, language := range info.Languages {
38+
err = leet.ToBeClear{
39+
Dir: dir,
40+
Language: language,
41+
}.Clear()
42+
if err != nil {
43+
fmt.Println(err.Error())
44+
}
45+
}
46+
47+
if idx > 0 {
48+
err = leet.CopyDirectory(info.SaveDir[0], info.SaveDir[idx])
49+
if err != nil {
50+
fmt.Println(err.Error())
51+
}
52+
}
53+
}
54+
55+
} else {
56+
titles := leet.GetAllQuestionTitleSlug()
57+
58+
for _, title := range titles {
59+
info := leet.GetQuestionInfo(title)
60+
for idx, dir := range info.SaveDir {
61+
for _, language := range info.Languages {
62+
err := leet.ToBeClear{
63+
Dir: dir,
64+
Language: language,
65+
}.Clear()
66+
if err != nil {
67+
fmt.Println(err.Error())
68+
}
69+
}
70+
71+
if idx > 0 {
72+
err := leet.CopyDirectory(info.SaveDir[0], info.SaveDir[idx])
73+
if err != nil {
74+
fmt.Println(err.Error())
75+
}
76+
}
77+
}
78+
}
79+
}
80+
},
81+
}
82+
83+
func init() {
84+
baseCmd.PersistentFlags().Bool("with-detail", false, "with-detail")
85+
}

0 commit comments

Comments
 (0)