如何判断两个数组元素相同且顺序一致(含旋转场景)
判断数组是否为原数组的旋转版本
假设有原数组:
[1,2,3,4,5,6]
以及旋转后的数组:
[3,4,5,6,1,2]
有没有简便方法判断二者是否匹配,还是必须编写特定的比较逻辑?
补充说明:原数组不应与以下数组匹配:
[4,3,5,6,1,2] // 4和3位置互换 [1,2,4,3,5,6] // 4和3位置互换
或是:
[1,2,3,4,5,6,7] // 元素数量过多
有个非常实用的简便方法,核心逻辑很简单:如果数组B是数组A的旋转版本,把A拼接一次得到A+A,这个新数组里必然包含B作为连续子序列。不过要注意几个关键细节:
- 先查长度:两个数组长度不一样的话直接判定不匹配,比如例子里那个多了一个7的数组,根本不用往下走。
- 避免数字歧义:因为是数字数组,直接拼接可能出问题(比如元素12和1、2混在一起),所以最好把数组转成带分隔符的字符串再处理,比如用逗号分隔。
举个实际操作的例子:
- 原数组转字符串:
"1,2,3,4,5,6" - 拼接自身后得到:
"1,2,3,4,5,6,1,2,3,4,5,6" - 旋转后的数组转字符串是
"3,4,5,6,1,2",一眼就能看到它是拼接后字符串的子串,所以判定匹配。
而像[4,3,5,6,1,2]转成字符串是"4,3,5,6,1,2",不在拼接后的字符串里,自然会被判定为不匹配,完全符合你的要求。
具体步骤总结:
- 若两个数组长度不同,直接返回
false - 把两个数组分别转成用相同分隔符(比如逗号)连接的字符串
- 检查拼接后的原数组字符串(
strA + strA)是否包含旋转数组的字符串strB,包含则返回true,否则返回false
这个方法比写循环逐个比对的逻辑简洁太多,针对数字数组完全够用;如果是处理复杂对象数组的话,这个方法不适用,但你的场景完全没问题。
内容的提问来源于stack exchange,提问作者abenci
相关产品推荐
相关产品推荐

