少侠们好~
在上一节的内容中,我们已经了解了关于数组的一些基本特点,以及常用的数组函数。
在这一节中,我们会分享 3 道比较基础但是有趣的数组相关的题,它们的解题思路和代码实现。
虽然只有 3 道题,但是这3道题背后都有着各自的故事,如果你完成它们的话,就有机会进一步探索相关的线索,解锁隐藏的技能,所以请一定要确保你理解了它们,这样才能方便迎接后续更难的挑战!
为了更好地从中获得收获,我们建议你在理解了题目意思后,先自行试着尝试完成,看能不能写出正确的代码。
如果实在没有好的思路,最后再查看我们提供的解题答案,因为只有通过你自己的思考,你才会真正的理解这些知识点。
当然,无论你是选择直接看答案,只通过阅读方式学习,还是一边看,一边亲自动手做,最后再看答案,你的努力都值得被认可,我们也尊重你的选择,
但不管怎样,我们希望你能认真对待他们,因为这些题可能是你将来面试时遇见的题,当你解决问题时灵光一闪的思路,又或者,
某天哪个程序员妹子突然问你一道相关的题也说不定呢~
好了,废话先不多说了,让我们正式进入今天的内容吧。
挑战1,实现一个 removeEven 函数,来过滤掉一个数组中所有的偶数,并返回过滤后的新数组。
解题思路:
1,手动遍历筛选出所需的元素。
题目要求我们过滤掉数组中的偶数,返回一个过滤后的新数组,
最简单的方式是我们创建一个新的空数组,然后手动遍历数组中的每一项,把其中的奇数添加到一个新数组里面,遍历完后,新的数组就只剩下奇数了。
代码实现:
时间复杂度:
由于我们需要遍历数组中的每一项,所以时间复杂度是 O(n)。
2,使用数组内置的 filter 函数。
另外一种方式是直接使用数组内置的 filter 函数,传递给它一个用于筛选的函数,它会依次将数组中的每个元素传递给我们的筛选函数,如果筛选函数返回结果为 true,该元素就会留下,如果为 false,则会过滤掉,如果你不是很清楚 filter 的用法的话,也不用急,以后我们会专门提到他们。
代码实现:
时间复杂度:
和之前一样,只是语法变了,我们还是只遍历数组中的每一项,所以时间复杂度依然是 O(n)。
挑战2,实现一个 merge 函数,这个函数接受2个排序后的数组,你需要做的是合并这 2 个数组,使它返回一个由这两个数组元素组成的一个新的排序后的数组。
解题思路:
方法1,先合并 2 个数组,然后对合并后的数组重新进行排序。
这种方案是最简单直接的方式了,我们都不用管 2 个数组原先是什么顺序,我们统一先合并,然后统一排序。
代码实现:
时间复杂度:
合并数组的时间复杂度是O(n + m),但是由于我们合并后还需要排序,而最好的排序算法时间复杂度是O(nlogn),我们取最大的时间复杂度,所以时间复杂度是 O(nlogn)。
方法 2:
实际上,由于题目中已经告诉我们,传递进来的 2 个数组是排序后的数组,我们可以利用好这个特点,创建一个新数组,然后用两个指针,依次从两个数组的第一个元素开始比较,每次将较小的元素添加到新数组中,然后移动指针,继续和下一个元素比较,以此类推,这样我们最多每个数组遍历一次就可完成。
通过下面的图片你应该可以更方便的明白什么意思~
代码实现:
时间复杂度:
由于每个数组只会遍历一遍,所以时间复杂度是O(m + n), m 和 n 分别是第一个数组的长度和第 2 个数组的长度。
OK,现在少侠你知道了,**对于任意两个排序后的数组,我们可以在O(m + n)的时间复杂度内将它们合并成一个新的排序后的数组,**请记住这个特点,因为在以后学习排序算法时,我们还会遇见它,世界上最好的排序算法之一正是利用了这个特点。
挑战3,实现一个 findMinimum 函数,这个函数接受 1 个无序的数字数组,希望你返回其中的最小的元素。
解题思路:
方法1,先将数组中的元素从小到大排序,然后返回第一个元素。
时间复杂度:
由于我们需要先对数组进行排序,所以时间复杂度是 O(nlogn)。
方法2,从第一个元素开始遍历数组,每次检测是否找到了更小的元素,一直到数组末尾。
想象你在读书的时候,如果老师需要找到成绩最好的人,可以怎么做呢?
她可以随便抽取一位同学,了解他的分数,然后看其他人是否有更高的分数,如果有,就拿着这个更高的分数,再问问看其他人是否比他还高的分数,依此类推,直到全班所有人比较完毕。
所以我们可以先假设数组第一个元素是最小的,将它保存起来,依次遍历,如果找到更小的,就用这个更小的元素替换掉,再和后面的元素继续比较,直到遍历结束。
时间复杂度:
由于我们只需要遍历数组一遍,所以时间复杂度是O(n)。
完全OK,经过你不懈的努力,你终于完成了这奇怪的 3 道题。
这 3 道题原本只是你从地上捡来的一张卷轴上看见的,
只是出于兴趣做一做,但是没想到的是,在你完成后,卷轴上突然出现了一些新的文字,这时你才发现,原来这 3 道题只是一个入门测验,
根据卷轴上的提示,在你完成之后,你可以继续选择探索属于他们背后的故事:
线索 1
继续探索 挑战1 中的 filter 背后的故事,有一定几率解锁部分江湖中的少见的函数式编程技巧。
“既然大家都喜欢纯洁的东西,那么纯函数,想必你也会很喜欢吧!”
线索 2
选择先探索 挑战2 背后的故事,有一定几率领悟江湖中最顶尖的排序算法之一,归并排序。
“什么?不知道排序算法 O(nlogN) 的时间复杂度是怎么来的?那你算是来对地方了!”
线索 3
选择探索 挑战3 背后的故事,有较大几率领悟江湖中的烂大街热门技能,冒泡排序。
“搞错没有啊,就 100 个用户,你告诉我要换个性能更快的算法?”
完全OK!
这就是本期的内容了,希望少侠你有所收获,玩的开心。
你可以根据最后的线索自行探索剩余的内容,做出你自己的选择,也可以看看我们下一次会如何选择,猜对了下次分享一个提高买彩票中500万的秘籍!
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!