ARTS打卡:第四周
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
Algorithm
本周记录如下:
104. Maximum Depth of Binary Tree(Easy)
Given a binary tree, find its maximum depth.
The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.
Note: A leaf is a node with no children.
Example:
Given binary tree [3,9,20,null,null,15,7],
undefinedreturn its depth = 3.
题目大致意思:
给一个二叉树,找到它的最大深度,最大深度是指从根节点到最远叶节点的最长路径上的节点数。
思路:使用DFS(深度优先遍历)
解法一:
1 | class Solution { |
解法2:
1 | public class Solution { |
21. Merge Two Sorted Lists(Easy)
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
Example:
Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4
题目:
合并两个已排序的链表,并将其作为一个新列表返回。新列表应该通过将前两个列表的节点拼接在一起来创建。
思路:
需要正确理解题意,这道题给出的例子,其实很容易误导做题者,一开始我就被误导了,直至后面才发现,这道题要的新列表是要有序。
我们可以用递归来解这道题,解决递归的流程一般有四步:
- 定义一个递归方法
- 推导出递归方法和基本情况(base case)
- 如果递归方法存在重复计算的问题,使用记忆化技术进行优化
- 尽可能的使用尾递归
代码如下:
1 | public class ListNode { |
运行结果:
Runtime: 0 ms, faster than 100.00% of Java online submissions for Merge Two Sorted Lists.
Memory Usage: 37 MB, less than 97.90% of Java online submissions for Merge Two Sorted Lists.
779. K-th Symbol in Grammar(Medium)
On the first row, we write a 0. Now in every subsequent row, we look at the previous row and replace each occurrence of 0 with 01, and each occurrence of 1 with 10.
Given row N and index K, return the K-th indexed symbol in row N. (The values of K are 1-indexed.) (1 indexed).
Examples:
Input: N = 1, K = 1
Output: 0Input: N = 2, K = 1
Output: 0Input: N = 2, K = 2
Output: 1Input: N = 4, K = 5
Output: 1Explanation:
row 1: 0
row 2: 01
row 3: 0110
row 4: 01101001Note:
N will be an integer in the range [1, 30].
K will be an integer in the range [1, 2^(N-1)].
题目:
在第一行,我们写一个0。现在,在后面的每一行中,查看前面一行,并将每个出现的0替换为01,将每个出现的1替换为10。给定第N行和索引K,返回第N行中的第K个索引符号(K的值为1个索引)(1个索引)。
解题思路:
从 Example 中,我们可以得出一个规律:
假设 row(N) 表示第 N 行,currLen 表示当前行的长度,preLen 表示上一行的长度,row(N)[K] 表示第 N 行,下标为 k 的值。
当 K 值小于等于 currLen/2,即 row(N-1) 的长度时,row(N)[K] 等于 row(N-1)[k], 当 K 值大于 currLen/2 时,row(N)[K] 等于 row(N-1)[K - preLen] 与 1 的异或值。
代码如下:
1 | public int kthGrammar(int N, int K) { |
Review
本周阅读的是以下三篇文章,都是与异步 I/O 模型有关的:
- Thousands of Threads and Blocking l/O:The Old Way to Write Java Servers Is New Again(and Way Better)
- Scalable IO in Java
- Boost application performance using asynchronous I/O
Tip
感觉这周没学到什么小技巧Orz,就分享一个小发现吧,IDEA 自带的一个功能, View -> Show ByteCode,效果如下:
Share
本周分享知秋大佬的有关 NIO 的系列文章: