当前位置 : 首页 » 文章分类 :  算法  »  LeetCode

LeetCode

开始LeetCode刷题,好长时间不写代码了,先从最最简单的开始。不怕题目简单弱智,先行动起来再说。
上次刷LeetCode还是14年底毕业找工作时,当时LeetCode还完全免费,只有一两百道题,我们实验室的大牛都是c++刷完一遍后又接着用java刷,我只做了一二十道题,惭愧。
现在LeetCode变得很高大上了,增加了付费订阅项目,而且除了算法题还有数据库题、shell脚本题、设计题等等,这是要搞IT面试的一站式模拟服务啊!


难度分级

博客标签
LeetCode | 标签 - 小马的笔记

官方难度分级

Easy | 标签 - 小马的笔记
Medium | 标签 - 小马的笔记
Hard | 标签 - 小马的笔记

我的主观难度分级

我的主观难度分级
我认为是Medium中等难度的:
中等 | 标签 - 小马的笔记
我认为是Hard困难难度的:
困难 | 标签 - 小马的笔记


leetcode功能介绍

AC代码执行时间分布图

LeetCode很高端的是还能看自己submission的耗时在本题所有submission中的排名,并且,点击其他时间还能看对应的提交代码,可以多学习学习大牛的高效代码,如图:


344 Reverse String的Accepted Solutions Runtime Distribution

Discuss讨论区

每个题的讨论区也都有很多人晒出自己的代码和想法,多看看能学到不少东西。


344 Reverse String的讨论区

树的可视化及隐藏公共代码

LeetCode比较屌的功能,所有树相关题目的控制台中,都有个“树结构可视化”开关,点击能可视化显示二叉树,非常方便,如下图:


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年第四季度运动记录

阅读
评论
2k
阅读预计7分钟
创建日期 2018-01-01
修改日期 2020-01-29
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论