算法笔试模拟题精解之“苹果收获程序”

简介: 因为每次下落时,苹果树每一层的节点都会往下掉一层。由此可以想到,如果苹果树某一层的节点的数目为奇数时,这一层的节点的苹果掉落到第一层时,由于一个节点只能存储一个二进制位的原因,只会剩下一个苹果。而如果苹果树某一层的节点数目为偶数,这一层的节点的苹果掉落到第一层时,剩下的苹果数目为0。

在线编程介绍

阿里云开发者社区在线编程产品,针对广大开发者学习、实践、面试、应聘、考试认证等打造的免费在线刷题神器。题库来自笔试模拟题、算法大赛模拟题等,界面整洁明了,操作简单,为用户营造专心答题的学习环境。点击链接开始体验:https://developer.aliyun.com/coding

本文为大家介绍其中的 第67题:苹果收获程序 的题目解析,具体如下:

题目描述

题目等级:容易
知识点:深度优先搜索/DFS

查看题目:苹果收获程序
Alice和Bob在春天的时候种下了一棵苹果树,为了吃到苹果,他们每天都会去给苹果树浇水。一眨眼到了苹果成熟的时候,但是他们却因为平时照顾苹果树太累了,没有更多的精力去收获苹果。身为程序猿的Bob灵机一动,写了一个自动收获苹果的程序。

这个程序把苹果树简化成了一个拥有n个节点,根节点为1的树,每个节点有1个苹果,苹果会在程序的作用下同时往根节点的方向掉落。

但是这个程序有一个致命的Bug:每当有两个苹果同时掉落到同一个节点的时候,这两个苹果会在Bug的作用下消失。

每当1苹果落到根节点1的时候,Bob就可以收获1个苹果。

Bob想要预测他们最后可以通过程序收获多少个苹果。

输入内容有两行。
第一行有一个正整数n(2<=n<=10^5),表示树有n个节点。
第二行有n-1个数p2,p3,...,pn,(1<=pi滚落到节点2上面的苹果会因为bug而消失的只剩一个。)

输出一个数字,表示Bob最后能收获的苹果数量。
示例1
输入:
5
[1,2,2,2]
输出:
3
注意
1、苹果的掉落速度是相等的,即每次都会掉落到与当前节点直接相连的节点上。

2、只要有苹果出现在根节点1上面就会被收获。

解题思路

苹果收获程序在正常情况下,有多个苹果落到同一节点时,应该会是一个相加的情况。结合这个BUG的情况,可以猜想,这个程序的BUG也许是因为这棵树每个节点只能存储一个二进制位导致的,在这种情况下出现的BUG和题目中的相符。

因为每次下落时,苹果树每一层的节点都会往下掉一层。由此可以想到,如果苹果树某一层的节点的数目为奇数时,这一层的节点的苹果掉落到第一层时,由于一个节点只能存储一个二进制位的原因,只会剩下一个苹果。而如果苹果树某一层的节点数目为偶数,这一层的节点的苹果掉落到第一层时,剩下的苹果数目为0。

因此可以统计每一层有多少个节点来解决这个问题,根节点1是第一层,掉落到一层的节点是第二层,以此类推,通过判断一个节点会掉落到的层数来判断该结点当前是第几层。遍历数组,用一个数组count记录每一层拥有的节点数,遍历数组,计算出一个节点所在的层之后,在count数组中将该层拥有的节点数加一。最后判断哪些层的节点数为奇数,这些层每层可以收获一个苹果,累加后即可得到答案。

提交以后,发现还有一些测试用例无法通过,通过分析以后发现,还需要注意一个问题。在遍历数组计算每个节点所在的层时,需要注意,如果数组中的数字表示这个节点会掉落到自身节点的位置上,也就是这个节点的苹果不会往下层掉,会永远留在这个节点,因此在统计每层的节点数时,这个节点不该被统计,而掉落到这个节点的其他节点的苹果也永远不会掉落到第一层,因此这些节点也不能被统计,不属于任何层,不被统计进count数组。

时间复杂度:O(n)
空间复杂度:O(n)

看完之后是不是有了想法了呢,快来练练手吧>>查看题目:苹果收获程序

720-150.png

相关文章
|
5月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
124 1
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
82 1
|
2月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
2月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
58 3
|
3月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
3月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
3月前
|
缓存 分布式计算 监控
算法优化:提升程序性能的艺术
【10月更文挑战第20天】算法优化:提升程序性能的艺术
|
7月前
|
监控 算法 Java
Java虚拟机(JVM)使用多种垃圾回收算法来管理内存,以确保程序运行时不会因为内存不足而崩溃。
【6月更文挑战第20天】Java JVM运用多种GC算法,如标记-清除、复制、标记-压缩、分代收集、增量收集、并行收集和并发标记,以自动化内存管理,防止因内存耗尽导致的程序崩溃。这些算法各有优劣,适应不同的性能和资源需求。垃圾回收旨在避免手动内存管理,简化编程。当遇到内存泄漏,可以借助VisualVM、JConsole或MAT等工具监测内存、生成堆转储,分析引用链并定位泄漏源,从而解决问题。
61 4
|
7月前
|
机器学习/深度学习 并行计算 搜索推荐
程序技术好文:桶排序算法及其Java实现
程序技术好文:桶排序算法及其Java实现
49 0
|
7月前
|
存储 人工智能 算法
程序与技术分享:Acwing算法笔记
程序与技术分享:Acwing算法笔记

热门文章

最新文章