0

0

破解编码面试:快慢指针技术部分

花韻仙語

花韻仙語

发布时间:2024-10-17 10:10:04

|

554人浏览过

|

来源于dev.to

转载

破解编码面试:快慢指针技术部分

在深入研究下一个技术之前,如果您正在准备编码面试并想要全面的资源,请务必探索破解编码面试的十大必备书籍(从初级到高级排名)。对于任何决心在顶级科技公司找到工作的人来说,这都是一本必备的书。

快指针和慢指针技术概述

快慢指针技术(也称为弗洛伊德龟兔赛跑)是一种优雅而有效的模式,用于解决涉及链表和数组等数据结构中的循环问题。这个想法是使用两个以不同速度移动的指针。通常,一个指针(“快”指针)一次移动两步,而另一个指针(“慢”指针)一次移动一步。这使您可以有效地检测循环,找到链表的中间,并解决涉及序列中的重复模式或中间点的各种其他问题。

何时使用快指针和慢指针:

  • 问题涉及在链表或数组中查找循环。
  • 你需要判断一个链表是否有环,并找到该环的起始节点。
  • 要求您一次性找到链表的中间元素。
  • 问题涉及循环模式或重复序列。

快、慢指针技术应用

1. 检测链表中的循环

它是什么:这是快慢指针方法解决的经典问题。如果链表包含环,则快指针最终会遇到慢指针,从而确认环的存在。

示例问题:给定一个链表,确定它是否包含循环。

class listnode:
    def __init__(self, value=0, next=none):
        self.value = value
        self.next = next

def has_cycle(head):
    slow, fast = head, head

    while fast and fast.next:
        slow = slow.next  # move slow by 1 step.
        fast = fast.next.next  # move fast by 2 steps.

        if slow == fast:
            return true  # cycle detected.

    return false  # no cycle detected.

说明:

  • 慢指针每次移动一步,快指针移动两步。
  • 如果存在循环,快指针最终会追上慢指针,确认循环的存在。
  • 如果快指针到达链表末尾,则表示不存在循环。

2. 在链表中查找循环的开始

它是什么:一旦在链表中检测到循环,另一个常见问题是找到循环的起始节点。这可以通过将其中一个指针重置到头部并将两个指针一次移动一步来完成。他们将在周期开始时见面。

示例问题:给定一个有循环的链表,找到循环开始的节点。

def find_cycle_start(head):
    slow, fast = head, head
    cycle_exists = false

    # first, determine if a cycle exists.
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next

        if slow == fast:
            cycle_exists = true
            break

    if not cycle_exists:
        return none  # no cycle found.

    # reset one pointer to the head and move both at the same speed.
    slow = head
    while slow != fast:
        slow = slow.next
        fast = fast.next

    return slow  # this is the start of the cycle.

说明:

  • 检测到一个循环后,将一个指针重置到头部,并一次移动两个指针(慢速和快速)。
  • 它们相遇的点就是循环的起始节点。

3. 查找链表的中间位置

它是什么:快慢指针技术也可以用于在单次遍历中找到链表的中间元素。

示例问题:给定一个链表,找到中间节点。

AdsGo AI
AdsGo AI

全自动 AI 广告专家,助您在数分钟内完成广告搭建、优化及扩量

下载
def find_middle(head):
    slow, fast = head, head

    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next

    return slow  # slow will be at the middle when fast reaches the end.

说明:

  • 快指针每次移动两步,慢速指针一次移动一步。
  • 当快指针到达列表末尾时,慢指针将位于列表的中间。

快指针和慢指针技术的主要优点

  • 效率:这种方法消除了多次遍历数据结构的需要。相反,它只需一次即可处理大多数问题,使其时间复杂度o(n)
  • 简单: 只需两个指针和一些条件,就避免了嵌套循环的复杂性。
  • 多功能性:它可以应用于涉及循环、中间元素或检测链表和数组中的重复模式的各种问题。

使用快指针和慢指针的常见面试问题

1. 链表循环检测

问题:给定一个链表,确定它是否包含循环。
解决方案:使用快慢指针方法来检测两个指针是否相交。

2. 链表中间

问题:找到单链表的中间元素。
解决方案: 移动一个指针的速度是另一个指针的两倍;当较快的指针到达末尾时,较慢的指针将落在中间。

3. 快乐数字

问题:如果一个数字以任何正整数开头,用其数字的平方和替换该数字最终得到 1,则该数字被视为“快乐”。如果不是,则序列将输入一个循环。检测一个数字是否是一个快乐的数字。

模式:使用快慢指针方法来检测序列是否进入循环。

def is_happy_number(n):
    def get_next(number):
        return sum(int(digit)**2 for digit in str(number))

    slow, fast = n, get_next(n)

    while fast != 1 and slow != fast:
        slow = get_next(slow)
        fast = get_next(get_next(fast))

    return fast == 1

面试中的快慢指针技巧

  • 使用链表进行可视化:这种技术在使用链表进行可视化时效果最佳,但它也可以应用于数组和其他序列。
  • 仔细检查周期长度:在寻找周期起点等问题中,在尝试找到起点之前仔细跟踪周期的长度非常重要。
  • 针对多次遍历进行优化:在计算列表中间等位置或者检测循环时,思考如何使用快慢指针方法来最小化遍历次数。

结论

快慢指针技术是面试工具箱中必备的工具。它非常适合涉及循环、中间元素和重复序列的问题。掌握这种模式将使您能够更有效地解决常见问题,通常将时间复杂度从 o(n²) 降低到 o(n)

在下一篇文章中,我们将探讨合并间隔模式,这是编码采访的另一种基本技术,它将帮助您轻松解决调度和合并问题。

敬请期待第五部分!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

550

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

30

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

45

2026.01.06

chatgpt官网入口地址合集
chatgpt官网入口地址合集

本专题整合了chatgpt官网入口地址、使用教程等内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

minimax入口地址汇总
minimax入口地址汇总

本专题整合了minimax相关入口合集,阅读专题下面的文章了解更多详细地址。

4

2026.03.16

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

7

2026.03.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

114

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

141

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

396

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4.3万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.6万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 94人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号