LeetCode
开始LeetCode刷题,好长时间不写代码了,先从最最简单的开始。不怕题目简单弱智,先行动起来再说。
上次刷LeetCode还是14年底毕业找工作时,当时LeetCode还完全免费,只有一两百道题,我们实验室的大牛都是c++刷完一遍后又接着用java刷,我只做了一二十道题,惭愧。
现在LeetCode变得很高大上了,增加了付费订阅项目,而且除了算法题还有数据库题、shell脚本题、设计题等等,这是要搞IT面试的一站式模拟服务啊!
难度分级
官方难度分级
Easy | 标签 - 小马的笔记
Medium | 标签 - 小马的笔记
Hard | 标签 - 小马的笔记
我的主观难度分级
我的主观难度分级
我认为是Medium中等难度的:
中等 | 标签 - 小马的笔记
我认为是Hard困难难度的:
困难 | 标签 - 小马的笔记
leetcode功能介绍
AC代码执行时间分布图
LeetCode很高端的是还能看自己submission的耗时在本题所有submission中的排名,并且,点击其他时间还能看对应的提交代码,可以多学习学习大牛的高效代码,如图:
344 Reverse String的Accepted Solutions Runtime Distribution
Discuss讨论区
每个题的讨论区也都有很多人晒出自己的代码和想法,多看看能学到不少东西。
344 Reverse String的讨论区
树的可视化及隐藏公共代码
LeetCode比较屌的功能,所有树相关题目的控制台中,都有个“树结构可视化”开关,点击能可视化显示二叉树,非常方便,如下图:
LeetCode的树可视化功能
此外,点击代码编辑框右上角的”Debug code in playground”,在调试界面可以找到LeetCode提供的根据层次遍历序列创建二叉树的代码段,可直接拷贝下来用,方便我们自己在本地调试,如下:
//根据层次遍历序列创建二叉树
public static TreeNode stringToTreeNode(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return null;
}
String[] parts = input.split(",");
String item = parts[0];
TreeNode root = new TreeNode(Integer.parseInt(item));
Queue<TreeNode> nodeQueue = new LinkedList<>();
nodeQueue.add(root);
int index = 1;
while(!nodeQueue.isEmpty()) {
TreeNode node = nodeQueue.remove();
if (index == parts.length) {
break;
}
item = parts[index++];
item = item.trim();
if (!item.equals("null")) {
int leftNumber = Integer.parseInt(item);
node.left = new TreeNode(leftNumber);
nodeQueue.add(node.left);
}
if (index == parts.length) {
break;
}
item = parts[index++];
item = item.trim();
if (!item.equals("null")) {
int rightNumber = Integer.parseInt(item);
node.right = new TreeNode(rightNumber);
nodeQueue.add(node.right);
}
}
return root;
}
关于提交的Java代码
1、只要提交的Solution
类中包含指定名称的方法,且输入输出符合题意即可,其他的很随意,比如Solution
类中还可以有其他方法,可以有自己测试用的main函数,甚至指定方法中还有其他控制台输出代码,都没问题,不会影响是否AC(当然由于无关代码太多导致执行太慢就不合适了)。
2、少用 static
变量
Online judge 判题过程中,同一个 Solution
的实例会在多个测试用例上被多次调用,static变量若没及时更新可能影响下次结果。
解决方法
1、使用非 static
变量
2、每次进入主方法时初始化 static
变量
GitHub 代码结构
GitHub 上建了个repo,leetcode-java(现在改名为algorithms),收藏从现在开始在LeetCode上用Java刷的题,希望自己坚持下来。
https://github.com/masikkk/algorithms
2018版代码结构
这个 repo 的结构参考了好多 leetcode 题解库的结构,最后定成这样:
- 整个repo是一个java工程,可直接在 IDEA 中导入。repo根目录的 README.md 做一个整体介绍,累积多了可以弄个表格索引。
- 代码的根文件夹是problems,也是默认的build path。
- 根文件夹里面每个题是一个package,包名是题目名称(由于包名必须是java合法标识符,不能以数字开头,所以我定的格式是
_编号_题目名
) - 每个题目的package中至少包含两个文件:
- 一个java源文件,是解题代码,java文件名也是题目名称,便以区分,所以即使把所有java文件都放到同一目录下也不会重复;
- 一个README.md,是相关笔记,可以写些解题思路,或者放上对应博客文章的链接。这样在GitHub上打开此题的目录时,自动会显示README.md的相关笔记。
- 为了区分不同年份的刷题,类名最后以
V年份
结尾,例如V2019
- 每个java文件中含两个类:
- 一个和文件同名的public类,其中包含
main
函数,用以自己调用Solution
类进行测试。 - 一个名为
Solution
的 private static 内部类(搞成private内部类是为了让不同年份的解题java类可在同一个package中共存),其中是解题的方法,可以写多个方法,只要每次提交时想提交的方法以规定命名即可。
这样在文件系统上也正好是problems文件夹下每道题是单独的一个文件夹,还能默认以序号排序。
其实一开始我是直接repo下每个题一个文件夹,java类在每个文件夹的默认package中,但这样有个问题是每个题目的java文件中的Solution
类由于在同一个作用域中会提示冲突,用题目名做类名又感觉不爽。
2020.1版代码结构
2018版的代码结构太复杂,简化
- 每个题目一个子文件太麻烦了,把所有题目类都放到
problems
文件夹中,一个题对应一个java类。 - 类名以
_编号_题目名
命名,方便自动按文件名排序,类中以年份结尾的私有静态内部类private static class SolutionV2020
命名各个年份写的Solution
类,以便于一个题目可以多次做,每次的解法能互相独立保存。 - 把 链表、二叉树等公用数据结构抽取到
structs
包中,把操作这些数据结构的static
方法(例如数组转链表、字符串转数组、字符串转二叉树等)放到数据结构本身的class中,避免每个二叉树题目中都重新定义一遍数据结构类。 - 不需要每个题的 readme.md 文件了,反正每道题都有对应的博客,在博客内有题目描述和题目链接,博客上也可以根据标签方便的进行索引。
2020.3版代码结构
为了使项目更具通用性,更好的分类管理 LeetCode 后来新推出的 《程序员面试金典(第 6 版)》 和 《剑指offer》 题集,也为了方便以后直接扩展其他 OJ 题库,对项目结构再次进行修改:
- 项目改名为 algorithms
- leetcode 目录中再分为3个子目录(也就是Java包): leetcode(LeetCode自有题目), offer(剑指offer题目), crack(程序员面试金典题目)
- 增加 others 目录,存放面试过程中,或者其他地方看到的题目。
2020.4版代码结构
1、 2020.4.2 为项目增加 maven 支持,maven 引入 junit5 测试框架,可以在代码中直接 @Test
定义测试方法,不需要每次都写 public static void main(String[] args)
了
clone 后用 IDEA 打开,进行如下设置:
File -> Project Structure -> Modules
把项目根目录 .
设为 Test Source Folders ,否则找不到 @Test
等 JUnit 中的类。
LeetCode题解repo参考
awesome-java-leetcode(java,表格索引)
https://github.com/Blankj/awesome-java-leetcode
Leetcode solutions in Java(java,列表索引)
https://github.com/gouthampradhan/leetcode
Java Algorithm Problems(java,表格索引,笔记)
https://github.com/awangdev/LintCode
LeetCode(java,表格索引,复杂度)
https://github.com/fishercoder1534/Leetcode
LeetCode(c++,python3,表格索引,笔记)
https://github.com/pezy/LeetCode
上一篇 LeetCode.344.Reverse String 反转字符串
下一篇 2017年第四季度运动记录
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: