2021-006ARTS

ARTS:Algorithm、Review、Tip、Share

  • Algorithm 算法题
  • Review 英文文章
  • Tip 回想一下本周工作中学到的一个小技巧
  • Share思考一个技术观点、社会热点、一个产品或是一个困惑

Algorithm

141. 环形链表

给定一个链表,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回 true 。 否则,返回 false 。

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

示例 1:
示例1

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:
示例2

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:
示例3

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

链表中节点的数目范围是 [0, 104]
-105 <= Node.val <= 105
pos 为 -1 或者链表中的一个 有效索引 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-cycle

解法描述
  1. 遍历法:将访问过的链表节点存储于Set中,判断遍历元素是否在Set中存在,是则链表中存在环,否则添加到Set中,直到遍历完所有元素。

  2. 快慢指针法:快指针每隔一个元素访问一次链表数据,即每次走两步,慢指针每次走一步,当快慢指针相交时,则存在环,否则当慢指针已经遍历完所有元素时,则不存在环。

注意:题目中给出的pos是为了表示链表中是否存在环的变量,方便我们自定义测试用例。

编码实现

解法一:遍历法

public boolean hasCycle(ListNode head) {
    if (head == null) {
        return false;
    }
    Set<ListNode> uniqSet = new HashSet<>();
    while(head != null) {
        if (uniqSet.contains(head)) {
            return true;
        }
        uniqSet.add(head);
        head = head.next;
    }
    return false;
}

解法二:快慢指针法

public boolean hasCycle(ListNode head) {
    if (head == null) {
        return false;
    }
    ListNode fast = head.next;
    ListNode slow = head;

    while(slow != null && fast != null) {
        if (fast == slow) {
            return true;
        }

        fast = fast.next == null ? fast.next : fast.next.next;
        slow = slow.next;
    }
    return false;
}
复杂度分析

解法一:
时间复杂度:O(N)

  • 当链表中不存在环时,快指针将先于慢指针到达链表尾部,链表中每个节点至多被访问两次。

  • 当链表中存在环时,每一轮移动后,快慢指针的距离将减小一。而初始距离为环的长度,因此至多移动 N 轮。

空间复杂度:O(N)

解法二:
时间复杂度:O(N)
空间复杂度:O(1)

Review

How To Ask Questions The Smart Way
《提问的智慧》是一篇介绍关于提问方方面面的文章,关于在网上提问,你需要做的、能做的、不能做的、为了得到答案有效的做法介绍的全面细致,可以说时关于提问的一篇最佳实践。RTFM(Read The Fxxking Manual)、STFW(Searched The Fxxking Web,温柔一些的版本:Google is your friend!)就是出自本文。

其中关于提问前需要做的工作让人印象深刻:

Before You Ask
Before asking a technical question by e-mail, or in a newsgroup, or on a website chat board, do the following:

  1. Try to find an answer by searching the archives of the forum or mailing list you plan to post to.

  2. Try to find an answer by searching the Web.

  3. Try to find an answer by reading the manual.

  4. Try to find an answer by reading a FAQ.

  5. Try to find an answer by inspection or experimentation.

  6. Try to find an answer by asking a skilled friend.

  7. If you’re a programmer, try to find an answer by reading the source code.

Tip

Java中做Json数据转换时,习惯使用 Jackson Library 实现,之前只是习惯使用其提供的一些基本功能,比如将JSON字符串与数据对象之间相互转换,以及忽略一些为空字段等特性,但缺乏一些全面的了解。翻了下官方的介绍,才知道其不只支持JSON数据格式,还有很多大量的其他数据格式也是支持的。

Jackson has been known as “the Java JSON library” or “the best JSON parser for Java”. Or simply as “JSON for Java”.

More than that, Jackson is a suite of data-processing tools for Java (and the JVM platform), including the flagship streaming JSON parser / generator library, matching data-binding library (POJOs to and from JSON) and additional data format modules to process data encoded in Avro, BSON, CBOR, CSV, Smile, (Java) Properties, Protobuf, XML or YAML; and even the large set of data format modules to support data types of widely used data types such as Guava, Joda, PCollections and many, many more (see below).

最近使用过程中,也有一些其他需求,比如忽略指定的一些字段@JsonIgnoreProperties、@JsonIgnore,忽略空值的属性
@JsonInclude(Include.NON_NULL) //or Include.NON_EMPTY, if that fits your use case,更改映射字段名@JsonProperty(“xxx”)等等
Google一下还是挺容易解决的,这里有一些简短的教程进行了介绍:
https://www.baeldung.com/tag/jackson-basics/

Share

积累的过程,有一件事始终是无法避开的:记录、总结、输出,这也是坚持做ARTS的原因,我在其中断断续续的坚持,希望在自己的历程中留下一些痕迹。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值