携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情
通过翻转子数组使两个数组相等
描述
给你两个相同长度的数组target和arr,每一步,你可以选择数组的任意非空子数组进行翻转,这个操作可以执行任意次,最终能否让两个数组相同。
例如:
给出两个数组:
let target = [1,2,3,4]
let arr = [3,4,2,1]
那我们需要怎么翻转才能让两个数组相同呢?
第一步:
翻转整个数组(整个数组也属于子数组的一部分),结果就成了[1,2,4,3]
第二步:
把[4,3]子数组进行翻转:[1,2,3,4],就和目标相同了。
再看一组:
let target = [1,2,7]
let arr = [1,9,2]
对于这组数组,我们是否可以通过翻转实现两个数组相等呢?
其实不能,因为两个数组里面的元素不完全相同,无论如何也不可能通过翻转来实现两者相等的。
对于本题,我们需要给出最后的结果,是否可以通过翻转子数组使两个数组相等,第一个可以返回true,第二个不能则返回false。
分析
根据以上描述能给我们一点启示,第一个例子是数组元素都相同,则可以通过子数组翻转实现相同,而第二个例子里面元素不同,则不可能,这个好理解,元素不同,永远不可能相等,因为元素值是不可能改变的,仅会改变元素的位置。
但我们需要确认的是:元素都相同是否就一定能够实现翻转达到相同的数组呢?
可以。因为可以翻转任意次数,假如我们每次仅翻转包含2个子元素的数组,最终也一定能够让两个数组相等。
那现在是否可以通过翻转子数组实现两个数组相等的问题就变成了两个数组中元素是否都相同的问题了。很简单,我们通过排序就很容易判断。
程序实现
根据以上分析,具体代码实现如下:
var canBeEqual = function(target, arr) {
// 如果两个数组相同则一定能够通过翻转子数组实现相等
return target.sort().join() === arr.sort().join()
};