Long Luo's Life Notes

每一天都是奇迹

By Long Luo

栈(Stack)的数据结构

栈的遍历

LeetCode Stack Problems

ProblemsDifficultySource CodeSolution
20. 有效的括号Easy
32. 最长有效括号Hard
71. 简化路径Medium
155. 最小栈Easy
232. 用栈实现队列Easy
341. 扁平化嵌套列表迭代器Medium
385. 迷你语法分析器Medium
726. 原子的数量Hard
1190. 反转每对括号间的子串Medium
面试题 03.01. 三合一Easy
面试题 02.05. 链表求和Medium

By Long Luo

链表(LinkedList)的数据结构

链表的遍历

链表

LeetCode LinkedList Problems

ProblemsDifficultySource CodeSolution
2. 两数相加Medium
19. 删除链表的倒数第 N 个结点Medium
21. 合并两个有序链表Easy
23. 合并K个升序链表Hard
24. 两两交换链表中的节点Medium
25. K 个一组翻转链表Hard
61. 旋转链表Medium
83. 删除排序链表中的重复元素 Easy
82. 删除排序链表中的重复元素 II Easy
92. 反转链表 IIMedium
138. 复制带随机指针的链表Medium
160. 相交链表Easy
146. LRU 缓存机制Medium
203. 移除链表元素Easy
237. 删除链表中的节点Easy
382. 链表随机节点Medium
430. 扁平化多级双向链表Medium
432. 全 O(1) 的数据结构Hard
460. LFU 缓存Hard
725. 分隔链表Easy
1600. 皇位继承顺序Medium
剑指 Offer 22. 链表中倒数第k个节点Easy
剑指 Offer 52. 两个链表的第一个公共节点Easy
面试题 02.05. 链表求和Medium

By Long Luo

之前的如何根据数组或者字符串创建链表? 详述了Leetcode链表 相关算法题的测试方法。在Leetcode中关于 的算法题中,很多树的题目,测试用例都是一个数组,比如102. 二叉树的层序遍历 中所示:

1
2
3
4
5
6
给定二叉树: [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7

那么问题来了,如何根据数组构造一颗树呢? 为了加快刷题,我们需要一个工具来实现构造树和打印树结构这2个问题。

树是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由 n(n>0)个有限节点组成一个具有层次关系的集合。

Tree

如上图所示,把它叫做「树」是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

树具有以下的特点: - 每个节点都只有有限个子节点或无子节点; - 没有父节点的节点称为根节点; - 每一个非根节点有且只有一个父节点; - 除了根节点外,每个子节点可以分为多个不相交的子树; - 树里面没有环路。

当我们完成一棵树的构建之后,虽然我们已经有树的前序、中序和后序遍历这种可以遍历树,但是如果我们如上图一样展示这棵树的结构,如何才能直观地打印出来呢?

如何打印一棵树?

这里我们借用Leetcode中二叉树的数据结构定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* Definition for a binary tree node.
*/
public class TreeNode {
public int val;

public TreeNode left;
public TreeNode right;

public TreeNode(int x) {
this.val = x;
}

public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}

思路

树的展示方式有2种,水平展示和竖直展示。竖直展示比较直观,水平展示更适合用于节点元素大小长短不一致的情况,Linux下展示文件结构就是水平展示。

阅读全文 »

By Long Luo

https://leetcode.cn/problemset/lcof/

官方源码:https://github.com/zhedahht/CodingInterviewChinese2

题目难度解答Source Code
剑指Offer 03. 数组中重复的数字EasyJava
剑指Offer 06. 从尾到头打印链表EasyJava
剑指Offer 09. 用两个栈实现队列EasyJava
剑指Offer 12. 矩阵中的路径MediumJava
剑指Offer 15. 二进制中1的个数EasyJava

By Long Luo

Leetcode链表 相关的题时,给出的测试用例总是数组或者字符串形式,比如 61. 旋转链表 这道题,Testcase如下所示:

示例 1:

61. Rotate List TestCase 1

输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3]

问题

如果在本地测试代码时,每次测试代码的时候,都需要自己创建测试用例,或者调用leetcode给的例子,都需要手动去创建一个链表的话,但这样效率太低!针对这种情况,写了几个工具函数用来处理链表的代码,可供大家参考。

测试代码

个人测试链表测试代码如下:

1
2
3
4
5
6
7
public static void main(String[] args) {
ListNode test1 = LinkedListUtils.constructListNode(new int[]{1, 2, 3, 4, 5});
System.out.println("[4,5,1,2,3] ?=" + LinkedListUtils.printLinkedList(rotateRight(test1, 2)));

ListNode test2 = LinkedListUtils.constructListNode(new int[]{0, 1, 2});
System.out.println("[2,0,1] ?=" + LinkedListUtils.printLinkedList(rotateRight(test2, 4)));
}

打印链表

Leetcode上链表最后输出形式:

输出:[4,5,1,2,3]

打印方法很简单,代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static String printLinkedList(ListNode head) {
if (head == null) {
return "[]";
} else if (head.next == null) {
return "[" + head.val + "]";
}

StringBuilder sb = new StringBuilder();
sb.append("[");
while (head.next != null) {
sb.append(head.val);
if (head != null) {
sb.append(",");
}
head = head.next;
}
sb.append(head.val).append("]");

return sb.toString();
}
阅读全文 »
0%