「兔了个兔」龟兔赛跑——乌龟和兔子能否相遇?
前言
森林里一年一度的赛跑大赛又开始了,乌龟和兔子又被分到了一组,这次乌龟还能跑过兔子吗?
比赛规则:
- 乌龟每次移动1个单元格,兔子每次移动2个单元格。
- 随机出现一条赛道,赛道可能为直线,也可能为含有环线。
- 如果乌龟和兔子跑进环形区域,则一直在环形区域内前进,直到相遇。
- 乌龟和兔子都很正经,只往前走,不会后退,也不会相互放水。
根据以上规则,写出程序,判断乌龟是否可以追上兔子(能否相遇)。
思路解析
从比赛规则中可以看出,如果赛道是直线的话,乌龟和兔子是不能相遇的(起点除外)。
所以,乌龟和兔子能否和兔子相遇的关键点在于赛道是否含有环状区域。
这里我们用到“快慢指针”的概念。
快慢指针
快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。
直线赛道
如果是直线赛道,因为兔子比乌龟走的快,只需要判断兔子是否能跑完整个赛道就可以了。
例如,直线赛道由以下节点组成,定义两个指针,兔子为快指针,乌龟为慢指针,如果快指针的下一个节点为Null
,说明是直线型赛道,这种情况乌龟是追不上兔子的。
环形赛道
如果是环形赛道,例如下图,其中10的下一个节点为5,在这里形成了一个环,一旦进入这个环中是没办法出去的,所以,如果乌龟和兔子在这种赛道上比赛的话,是会出现相遇的情况的。
因为兔子跑的快(快指针),兔子会先进入环中,乌龟跑的慢后进入环中。此时,乌龟和兔子则一直在环中前进,
代码实现
经过上面的分析,现在来看一下代码的实现。
定义节点
首先定义一个节点类Node
,该类有两个属性,一个属性是value
用来存放节点的值,另一个属性为next
用来存放下一个节点的内存地址。
方便起见,把属性都定义为了public
类型。
public class Node {// 链表节点的值public int value;// 链表节点的下一个指针public Node next;public Node(int value) {this.value = value;}
}
复制代码
判断是否有环
判断是否存在环的方法。如果链表为空或小于两位就直接返回false
了,长度大于两位才判断是否有环。
public static boolean hasCycle (Node node) {if (node == null || node.next == null || node.next.next == null) {return false;}// 快指针Node quick = node;// 慢指针Node slow = node;// 快指针走的快, 所以判断有没有下一个节点while (quick != null && quick.next != null) {quick = quick.next.next;slow = slow.next;// 如果快慢指针为同一个, 说明存在环形区域if (slow == quick) {return true;}}return false;
}
复制代码
生成直链表
使用for
循环生成9
个节点,定义一个temp
变量荣节点链接起来。
public static void main(String[] args) {Node node0 = new Node(0);Node temp = node0;for (int i = 1; i < 10; i++) {Node node = new Node(i);temp.next = node;temp = node;}boolean cycle = hasCycle(node0);System.out.println(cycle ? "乌龟和兔子能相遇" : "乌龟和兔子不能相遇");
}
复制代码
Debug
看下代码node0
的值,可以看出最后一个节点的next
为null
。
因为是直链表,所以运行输出结果为“乌龟和兔子不能相遇”。
生成环形链表
先生成一个直链表,再结束时,让最后一个节点指向节点5,所以定义了一个临时变量来存储节点5的地址,这样就形成了一个环。
public static void main(String[] args) {Node node0 = new Node(0);Node temp = node0;Node node5 = null;for (int i = 1; i < 10; i++) {Node node = new Node(i);temp.next = node;temp = node;if (i == 5) {node5 = node;}}temp.next = node5;boolean cycle = hasCycle(node0);System.out.println(cycle ? "乌龟和兔子能相遇" : "乌龟和兔子不能相遇");
}
复制代码
Debug
看下代码node0
的值,可以看出节点9的next
为节点5,形成了一个环。
因为是环形链表,所以运行输出结果为“乌龟和兔子能相遇”。
总结
本文借助“龟兔赛跑”介绍了了快慢指针以及使用快慢指针来判断一个链表中是否含有环,如有错误,欢迎指出。
至于在“龟兔赛跑”中,乌龟和兔子是否能相遇,就看选的赛道啦。
2023年,祝您兔年快乐、前“兔”似锦、大展宏”兔“。
作者:Java星辰
原文链接:https://juejin.cn/post/7190592456214183992
「兔了个兔」龟兔赛跑——乌龟和兔子能否相遇?相关推荐
- 「小虎电商早报」2月24日 苏宁易购北区预计新开零售云门店906家
[300万+电商人的专属早报] 2月24日,星期四 你的竞争对手都在看: ------------ 1.J&T极兔速递宣布进军拉丁美洲市场 2.eBay第四季度营收26.13亿美元 亏损8.9 ...
- 崩坏3服务器维护2月8号,崩坏3 3.9版本「逐暗星辉」更新维护通知
亲爱的舰长: 为了给舰长更好的游戏体验,休伯利安号将在4月16日进行版本更新维护,维护完成后战舰将更新为3.9版本--「逐暗星辉」. 维护时间 4月16日05:00~12:00 维护时间可能会根据实际 ...
- 被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」
故事的背景如下图,李笑来 老师于10月19日在 知乎Live 开设 一小时建立终生受用的阅读操作系统 的讲座,他老人家看到大家伙报名踊跃,便在微博上发起了一个 猜数量赢取iPhone7 的活动. 因为 ...
- 有一种新年味叫「DOU 来云过年」
年轻人的第一次就地过年. 2021 年的新年印记注定难以磨灭,疫情常态化发展,许多异乡打工人被迫成为「原年人」(减少人员流动,就地过年). 第一次不能回到家乡,独自在工作地过年:第一次不能与父母.亲友 ...
- 【新消费创投复盘】中式点心「祥禾饽饽铺」完成过亿元首轮融资;护肤品牌「自然旋律」完成数亿元B轮战略融资
祥禾饽饽铺完成过亿元首轮融资:自然旋律完成数亿元B轮融资 以下一周投融资复盘内容(10月25日至10月29日)由新消费星球整理. 一.国内投融资 中式点心「祥禾饽饽铺」完成过亿元首轮融资 36氪消息, ...
- 首批辉瑞疫苗紧急出仓,传特朗普将「以身试苗」
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来源:Bloomberg 编辑:小匀.QJB [导读]辉瑞公司首批新冠疫苗出仓,据称, ...
- 如何设计 Web App 应用架构?「两分钟了解 IOING」
IOING 在做些什么? IOING 在你的代码和浏览器之间架设了一个中间解释层,该解释层提供了一套新的语法来填补浏览器所不具备的能力. SPA 开发痛点 开发一个 SPA 应用的痛点是不同模块页面的 ...
- 「动手学深度学习」在B站火到没谁,加这个免费实操平台,妥妥天花板!
论 AI 圈活菩萨,非李沐老师莫属. 前有编写「动手学深度学习」,成就圈内入门经典,后又在B站免费讲斯坦福 AI 课,一则艰深硬核讲论文的视频播放量36万,不少课题组从导师到见习本科生都在追番. 如此 ...
- AI 领域新突破,腾讯发布首个AI药物研发平台「云深智药」
7月9日,2020世界人工智能大会云端峰会开幕.会上,腾讯首席运营官任宇昕公布了用AI助力药物研发领域的最新进展--由腾讯自主研发的首个AI驱动的药物发现平台"云深智药(iDrug)&quo ...
最新文章
- STM32单片机SIM800C创客GSM短信GPRS可编程模块SDK二次开发DIY
- 构建dubbo分布式平台-maven构建ant-framework核心代码annotation
- 技术干货 | 视频最佳体验之自适应调节系统
- Xftp连接linux(ubuntu)时提示ssh服务器拒绝了密码,请再试一次
- 谷歌maps菜单语言设置_Google Maps:拯救未来之路— UX案例研究
- 左侧栏下拉框HTML代码,html5下拉菜单代码
- 在 iOS 客户端上通过 bitcode 为第三方库修复 bug
- koa2 引擎模版html,Koa2模板引擎Ejs使用教程
- C++操作符operator的另一种用法
- dubbo超时机制原理
- 电脑win10黑苹果双系统
- 机器学习中的数学——激活函数(一):Sigmoid函数
- 爱快路由,通过域名分流解决QQ网吧特权不生效的问题
- C#程序设计--控制台程序输出上下三角形和菱形
- 详细介绍文本检索基准BEIR: A Heterogeneous Benchmark for Zero-shot Evaluation of Information Retrieval Models
- 谢烟客---------Linux之bash编程
- 使用ESP8266-01S 作为Station PC作为Server通讯出现 ERROR CLOSED问题的解决办法
- mxGraph画图区域使用鼠标滚轮实现放大/缩小
- Java常见问题之HashMap扩容、树化、死链
- 百鸡百钱python教程_python百钱百鸡