少侠,来试着完成 3 个简单有趣的数组题,并解锁它们背后隐藏的线索吧~

793 阅读7分钟

少侠们好~

在上一节的内容中,我们已经了解了关于数组的一些基本特点,以及常用的数组函数。

在这一节中,我们会分享 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万的秘籍!