首页 > 编程语言 >人间算法题:到底是不是一个环?

人间算法题:到底是不是一个环?

时间:2024-04-19 17:56:04浏览次数:18  
标签:head slow ListNode Val 是不是 fast Next 算法 人间

很多人都说人生就是一个循环,每天重复重复。
而所谓环,对于写代码的小伙伴来说是有特殊定义的。我的理解就是节点循环,就成了环。
刚好刷到一个掘金好友分享的腾讯一面算法题:判断一个单链表是不是一个环。
其实有很多办法来实现,但是我更喜欢用快慢指针来判断环的形成。思路如下:

  1. 定义一个slow指针,指向单链表的头部节点head。定义一个fast指针,初始化为head.next。
    2.然后先判断fast和fast.next是否是空,如果为空,肯定不是环。
    3.然后开始移动快慢两个指针。slow指针每次只移动一个节点,fast指针每次移动2个节点。
    4.如果在移动的过程中slow指向的节点等于fast指向的节点,那么说明循环了,这是一个环。
    5.如果移动到链表最后(假设不是环,有尾部)还是没有slow和fast节点重合,那么说明不是环。

所谓环,那么就一定会快慢指针一定会相遇。

那么用golang实现一下:

package main

import (
    "fmt"
)

type ListNode struct {
   Val int
   Next *ListNode
}
func HasCircle(head *ListNode) bool {
    slow, fast := head, head.Next

    if fast == nil || fast.Next == nil {
        return false
    }

    for fast != nil && fast.Next != nil {
        if slow == fast {
            return true
        }

        slow = slow.Next
        fast = fast.Next.Next
    }

    return false
}

func main() {
    // create the list
    head := &ListNode{Val: 1}
    head.Next = &ListNode{Val: 2}
    head.Next.Next = &ListNode{Val: 3}
    head.Next.Next.Next = &ListNode{Val: 4}
    head.Next.Next.Next = head.Next
    fmt.Println("Is circle? ", HasCircle(head))
}

死去的记忆又在攻击我了,我想起多年前去一家互联网医疗公司面试的时候也遇到这道题,我也给出了这个解法,但是面试官一脸懵逼,无法理解我的思路。今天我仔细想想,也许是他想看到我用深度优先搜索(DFS)来实现。
所谓深度优先,就是一种递归算法,用于搜索图或树数据结构的所有顶点。该算法从起始节点开始,尽可能沿着每条路径探索,直到无法再前进为止,然后进行回溯。DFS通常使用堆栈来跟踪已发现的节点,以便进行回溯。这种算法的时间复杂度为O(V+E),其中V是顶点数,E是边数。在实际应用中,DFS还有许多应用,包括寻找连通分量、检测图中的环、拓扑排序等。
检测环,用它就对啦,实现如下所示:
···
func dfs(node ListNode, visited map[ListNode]bool) bool {
if node == nil {
return false
}

if visited[node] {
    return true
}

visited[node] = true

return dfs(node.Next, visited)

}
func HasCircleByDFS(head ListNode) bool {
visited := make(map[
ListNode]bool)
return dfs(head, visited)
}

func main() {
// create the list
head := &ListNode{Val: 1}
head.Next = &ListNode{Val: 2}
head.Next.Next = &ListNode{Val: 3}
head.Next.Next.Next = &ListNode{Val: 4}
head.Next.Next.Next = head.Next
fmt.Println("Is circle? ", HasCircleByDFS(head))
}

···

总结
有时候面试者需要去推测出题人的意图,条条道路虽然通罗马,但你的解法不一定能打动考官。

标签:head,slow,ListNode,Val,是不是,fast,Next,算法,人间
From: https://www.cnblogs.com/freephp/p/18146529

相关文章

  • 行人属性AI识别/人体结构化属性AI识别算法的原理及应用场景介绍
    行人属性AI识别技术是一种基于人工智能技术的图像识别技术,通过对行人的图像或视频进行处理和分析,提取出其中的结构化信息,如人体姿态、关键点位置、行人属性(性别、年龄、服装等)等。行人结构化数据分析的方法包括姿态估计、关键点检测、行人属性识别等:姿态估计是指根据行人的姿势......
  • 音视频开发是不是C++开发中最难的细分方向?
    音视频开发是不是C++开发中最难的细分方向?     关注者611被浏览599,438关注问题​写回答​邀请回答​好问题7​3条评论​分享​  查看全部67个回答luluce不关心国事的程序猿(不会QT)。已关注......
  • SPFA算法
    单源最短路算法,可以处理负边权,平均时间复杂度\(O(kn)\),最坏时间复杂度\(O(mn)\)问题描述:有一个连通图\(G=(V,E)\),连接节点\(i\)和节点\(j\)的边权写作\(e^i_j\)(\(e^i_j\geq0\)),求从起点(\(s,s\inV\))开始,到其它各个节点(\(d,d\inV-s\))的最短路长度。思路详解:设从起点s到节点d......
  • yolo,rcnn,fastrcnn,ssd等算法有的区别
    chatgpt回答:YOLO(YouOnlyLookOnce),RCNN(Region-basedConvolutionalNeuralNetworks),FasterR-CNN,SSD(SingleShotMultiBoxDetector)等算法都是用于目标检测的经典算法,它们在实现目标检测任务时有一些区别。YOLO:YOLO是一种单阶段(single-stage)目标检测算......
  • 第五节 极限运算法则
    第五节极限运算法则  本节讨论极限的求法,主要是建立极限的四则运算法则和复合函数的极限运算法则,利用这些法则,可以求某些函数的极限定理1:两个无穷小的和是无穷小。  用数学归纳法可证:有限个无穷小之和也是无穷小定理2:有界函数与无穷小的乘积是无穷小.  推论1:常......
  • 1.对软件工程课程的希望及个人目标。2、软件工程是不是教会不怎么会写程序的人开发软
    对于软件工程课程,我的希望和个人目标如下:对软件工程课程的希望:1.我希望通过软件工程课程,深入理解并掌握常用的软件设计模式,能够运用到实际项目中。2.学习系统的软件需求分析方法,以便更好地理解用户需求。3.学习软件测试的基本方法和技术,能够编写测试用例,进行单元测试、集成测......
  • KMP算法
    KMP算法KMP算法的核心思想是利用模式串自身的特性,在匹配过程中尽量避免回溯,以提高匹配的效率。它通过构建一个部分匹配表(也称为next数组),来指导匹配过程中模式串的移动位置,从而减少不必要的字符比较。KMP算法的基本步骤1.构建部分匹配表(next):遍历模式串,对于每个位置i,找出以......
  • good-turning算法
    解答:合并验证集与训练集,计算合并之和的数据集在训练集中出现的次数:张三喜欢外出旅行李四登山王五不喜欢12211100那么:r012N(r)242根据公式计算可以得到:r*r(0)=2r(1)=1r(2)=2N(r*)242(最高次数的N(r*)不变的)那么......
  • 边缘计算智能分析网关V4地面垃圾AI检测算法介绍及场景应用
    在传统的卫生监管场景中,无法及时发现地面遗留的垃圾,通过人工巡逻的方式需要大量的人力、物力和时间,而且效率不高,并存在一定的滞后性,而采用地面垃圾AI检测算法则可以大大提高监管效率。TSINGSEE青犀AI智能分析网关V4的地面垃圾AI检测算法可以自动识别划定区域内遗留的垃圾,若达到设......
  • TSINGSEE青犀算法中台消防通道堵塞/占压AI检测算法的介绍及应用
    消防通道是建筑物内用于紧急疏散的通道,其畅通无阻对于保障人员生命安全至关重要。然而,由于各种原因,消防通道经常会被杂物、车辆等堵塞,一旦发生火灾等紧急情况,后果不堪设想。为了有效解决这一问题,我们提出了一种基于人工智能技术的消防通道堵塞占用检测算法。该算法利用深度学习技......