Algorithm

题目

题目描述

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。答案中不可以包含重复的三元组。

题目解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {

        List<List<Integer>> result = new ArrayList<>();

        if(null == nums || nums.length < 3) {
            return result;
        }

        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i ++) {
            if(nums[i] > 0) {
                break;
            }

            if(i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }

            int L = i + 1;
            int R = nums.length - 1;

            while (L < R) {
                int target = nums[i] + nums[L] + nums[R];
                if (target == 0) {
                    result.add(Arrays.asList(nums[i], nums[L], nums[R]));
                    while (L < R && nums[L] == nums[L + 1]) L++;
                    while (L < R && nums[R] == nums[R - 1]) R--;
                    L++;
                    R--;
                } else if (target < 0) {
                    L++;
                } else {
                    R--;
                }
            }
        }
        return result;
}

一共有三种解法,一是三层for循环,时间复杂度为O(n3);二是二层for循环外加Hash表,时间复杂度为O(n2),增加了空间复杂度O(n);第三种就是上面的解法,排序后从两侧开始匹配,时间复杂度为O(n2),空间复杂度为O(1)

Review

Managing my personal knowledge base这是一篇关于个人管理的文章,作者讲述了自己是怎样对个人知识进行分类 管理的。

书签管理

作者将书签进行了分层,不同级别(访问频率,保留时间)的书签由不同的工具来管理。

Chrome Bookmarks

浏览器书签方便添加,可按目录进行组织,可多设备同步,可以使用快捷访问工具(文中提到的是Albert,Mac上可以使用Alfred来实现)进行访问。但是浏览器书签的缺点也很明显,不能给书签打tag,不能加时间戳,不能加注释,还不能通过复杂的方式进行过滤。当书签数量上升后,会变得很难管理。

适合Chrome进行管理的书签:

  • 云平台的web管理面板
  • Gitlab面板
  • 内容网站,如Hacker News,InfoQ

不适合Chrome进行管理的书签:

  • 稍后读的博客文章
  • 开源项目链接
  • Stack Overflow上的问题

Workona

这个工具可以创建基于浏览器Tab的工作空间,对于一些长周期的项目来说很有用。对于一些特定的依赖场景,使用这个工具效率更高,其实使用Chrome的插件也可以达到管理多个Tab的效果。Workona还可以添加应用的信息,这些信息不被当作是书签来处理。

Notion

这个一个值得学习的工具,它用来管理与维护巨大的书签库。这个工具也是作者的主要知识管理工具。Notion会自动存储条目的元数据,如创建时间,重要性,而且可以对条目进行打标签。Notion支持针对不同用途来创建多个数据库。Notion的问题是还不支持快捷工具的搜索集成。Notion我也使用过,不过个人不喜欢鼠标操作,现在我的主要知识管理工具是Emacs+Org Mode+Org-Roam,功能强大到只能说好。

原生书签资源

这里面主要是一些经常访问的网站,以及在网站中进行搜索的情况,这种情况就直接保存网站地址即可。这类资源包括:

  • 社交类网站
  • Gitlab或者GitHub
  • Hacker News等内容网站

对于这类原生书签资源可以使用工具配置成快捷方式,用快捷键直达。

组织生产资源

博客文章

  • 文章草稿

    作者所有的文章草稿都保存在Notion中,这样可以在写作时快速关联引用链接,代码片断,还可以对内容进行版本控制。一旦文章完成,修改文章的状态为Release。

  • 跟踪最近想法

    作者的文章都很长,使用Notion可以对先前的文章进行更新关联。

  • 跟踪资源文件

    作者把博客Notion库与书签Notion进行关联来达到目的。

做笔记

何时做笔记

  • 从音频获取信息,如播客,会议
  • 保存经常需要使用但是不属于指定项目的信息,如带多个参数的命令行信息;将来可能会重复的说明信息,如部署环境说明。
  • 问题,不能立即向指定人请教的问题

不应该成为笔记的情况

  • 项目相关的信息,这些东西应该有专用的系统来追踪
  • 短暂使用的信息,如简单的谈话信息,使用后就可以删除了

总之要把握住度,不要过多也不要过少。

为什么做笔记

最明显就是记录事情。记笔记可以帮助大脑来构建知识结构,笔记可以帮助从记忆中恢复记忆。一些非常难的信息也是需要做笔记,做笔记也可以在写博客时被用到。

怎样做笔记

使用Markdown格式来进行书写,给每个笔记打上明确的标签,对于一些经常做的笔记(如会议)可以配置一个指定样式的模板来快速生成内容框架。

项目相关的信息

所有项目相关的信息最好都被在一起处理。像使用Github或者Gitlab,这两个网站都提供了与项目相关的功能,如Wiki,代码管理,问题追踪等等。

文件管理

  • 使用云存储来同步文件以便多设备处理。
  • 组织一个合适的文件结构以便可以快速的找到想要的文件。
  • 可以使用快捷查找工具来进行查找,也可以使用命令工具(find, grep)进行快速查找。

代码片断

作为码农这个少不了,一般的开发工具都支持对代码片断的管理,高效的组织也有利于后期的查找与维护。

快捷键管理

工具多后记快捷键就费力了,我不会维护一个快捷键列表,而是只会记录我想要使用的命令来处理,当然在选择工具时就要看其是否支持命令查找,对于那些常用的快捷键,用多了自然就记住了。

Tip

Idea中调试修改变量的方式:

  • 在调试面板中对变量进行修改,一般为F2,这个在修改一些简单变量时很有用
  • 在代码中选中要修改的变量,Alt+F8来修改,提供代码面板,支持功能更多

Share

一封写给我自己的信,作为一个新的软件工程师,这篇文章总结了一些对新入行软件工程师的建议,作为老的软件工程师,读后感触很多。软件的道路是漫长的,要戒焦躁;尊重他人,而不是尊重头衔;交付价值,而不是代码 。等等,我会再读10遍的。