Algorithm
本周的 LeetCode 题目为 102. 二叉树的层次遍历
题目简介:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例如下:
1
/ \
2 3
/ /\
4 5 6
[[1],[2,3],[4,5,6]]
题目思路:层次遍历的基本思路,使用一个队列记录当前层,然后遍历,记录节点的值和其左右孩子。一个需要注意的地方:在遍历前获取队列的长度(即该层的长度)。
最终代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int length = queue.size();
List<Integer> tmpArr = new ArrayList<>();
for (int i = 0; i < length; i++) {
TreeNode tmpNode = queue.poll();
if (tmpNode != null) {
tmpArr.add(tmpNode.val);
queue.offer(tmpNode.left);
queue.offer(tmpNode.right);
}
}
if (!tmpArr.isEmpty()) {
ans.add(tmpArr);
}
}
return ans;
}
}
Review
本周 Review 的英文文章为:Tools for thinking
在文章中,作者介绍了几个他自己使用的记录思考的工具。具体可以分为两类,第一类是大的文件来记录,第二类是在线的网页工具如Kinopio、Joplin用来记录。
- 大的文本文件或者表格
创建一个文件/表格,这个表格就好比一个标签,你在这个文件里可以记录任何事情或内容,比如一个手机号码、要做的事情、发现不错的书籍或电影名称、要买的东西、临时的笔记等等。你可以通过在文件里记录内容来减轻大脑的任务,就像一个备忘录一般。可以定期整理这个文件的内容来发现需要长时间保存的内容。你可以使用任何文本编辑器用来记录,如记事本、Notepad++、VS Code、Vim 等等,需要注意的是你要及时保存这个文件以免它丢失信息。表格和文本文件类似,看你的需要了。
-
Joplin。Joplin非常适用于关于特定主题的笔记,并将它们联系在一起,按标签和笔记本分组。看起来很像Evernote,但Joplin与Evernote不同之处在于,它支持Markdown和代码高亮,而且它是免费的。
Tip
算术右移 V.S. 逻辑右移
我们知道计算机表示有符号整数时,最开始的一位称为符号位,用来标识正负数。在算术右移中,左侧补0还是补1取决于原本的符号位;而在逻辑右移中,左侧永远是会补0。即在对负数进行移位操作时,需要想清楚要进行的是逻辑右移还是算术右移。
举例:-2
用 8 比特会被表示为 11111110
,其符号位为1
,那么进行一个算术右移后得到的结果是 11111111
即 -1
,而进行一次逻辑右移后得到的结果是 01111111
即 127。
在 Java 中, >>
运算符代表算术右移,而 >>>
运算符代表逻辑右移。示例代码如下:
public class Main {
public static void main(String[] args) {
int num1 = 2;
System.out.println(num1 >> 2); // 0
System.out.println(num1 >>> 2); // 0
int num2 = -2;
System.out.println(num2 >> 2); // -1
System.out.println(num2 >>> 2); // 1073741823
}
}
Share
注重平时积累。本周的 ARTS 是一次性写成的,但实际写起来并不是那么顺利,因为有不少时间花在了找素材上。因此这提醒我需要重视平时积累素材,一来不用再花时间来确定写什么,二来平时就准备好了内容,到时候再稍加整理即可发布,三来节省下的时间可以用来创作单独的文章。