当前位置: 首页 > 知识库问答 >
问题:

检查两个数组是否具有相同顺序的元素

侯池暝
2023-03-14

如何检查两个数组(循环)是否具有相同顺序的相同元素。例如,让我们以数组[1,2,3,4]为例。

对于[2,3,4,1]、[3,4,1,2]、[4,1,2,3],测试应返回true,但对于[1,3,2,4]、[1,4,2,3]或[1,2,3,5]则不返回true。

我最初的方法是找到第一个匹配项——每个数组中一个相等的元素——并将这两个元素视为各自数组的初始元素,我逐个比较了数组的其余元素。

有没有更好的办法?非常感谢。

共有3个答案

施阎宝
2023-03-14

如果不允许重复,只需在第二个数组中找到与第一个数组中的第一个数组相等的另一个元素,然后从那里检查它们,解决方案是O(n):

boolean areEquivalent(int[] array1, int[] array2) {
  int i1 = 0, i2 = 0;
  for (; i2 < array2.length; ++i2)
    if (array2[i2] == array1[i1])
     break;

  // no element found in common, they can't be equivalent
  if (i2 == array2.length)
    return false;

  for (int j = 0; j < array1.length; ++j)
    if (array1[i1+j] != array2[(i2+j) % array2.length]
      return false;

  return true;
}

如果允许重复,您必须考虑到i1i2都可以从不同的点开始并尝试所有它们,如果的最后一个失败,您应该更改i1以从相同值的第二次出现开始,依此类推。完成此操作后,您必须再次更改i2e重试,因此不同的方法(如Jay提出的方法)会更好。

隗高旻
2023-03-14

假设此算法可以帮助您。

public void test() {
    int[] a1 = {1,2,3,4};
    int[] a2 = {2,3,4,5};
    int[] a3 = {2,3,4,1};
    if (calculateDifference(a1, a2)) {
        System.out.println("a1 has same elements order to a2");
    }
    if (calculateDifference(a1, a3)) {
        System.out.println("a1 has same elements order to a3");
    }
    if (calculateDifference(a2, a3)) {
        System.out.println("a2 has same elements order to a3");
    }
}
private boolean calculateDifference(int[] a1,int[] a2){
    int total = 0;
    boolean match = false;
    if (a1.length != a2.length) {
        return match;
    }
    for (int i = 0; i < a1.length; i++) {
        int a1Num = a1[i];
        int a2Num = a2[i];
        total += a1Num - a2Num;
    }
    if (total == 0) {
        match = true;
    }
    return match;
}
郭元凯
2023-03-14

如果一个数组是循环的,那么数组数组具有另一个部分的整个数组。例如:

 [2 3 4 1] append [2 3 4 1] = [2 3 4 1 2 3 4 1]
                                    |-------|

正如您所看到的,同一数组的两次追加中的“某处”。

因此,通过这个逻辑,您可以执行一个O(n*m)操作,检查每个案例是否匹配(n为array1,m为array2):

 //array1 has [2 3 4 1 2 3 4 1]
 //array2 has [1 2 3 4]
 boolean check = false;
 for(int i = 0; i < array1.length(); i++) {
   for(int j; j < array2.length(); j++) {
      if((i+j) <= array1.length()) {
        if(array1[i+j] == array2[j])
            check = true;
        else
            check = false;
      }
   }
   if(check)
       return true; // returns true if all array2 == some part of array1
 }
 return false;

您还可以查看Boyer-Moore算法来对此进行改进。它用于字符串匹配,但这里可以应用相同的逻辑。

其基本思想是有一个array2的查找表,并且能够“跳过”您知道的值,无需再次检查。

1   2   3  4  5  6
3   4   5
^-------^  lookup table sees that the offset is 3 to match array2[0] with array1[2]

    1   2   3  4  5  6
 skip to--->3  4  5
    would be the next iteration
 类似资料:
  • 每个人如何检查两个堆栈是否具有相同的值? 例如,在stack1中我有[1,3,4,5],在stack2中我有[4,3,1,5],因此堆栈具有相同的值,并且Method需要返回true。 此外,堆栈必须(最终)与给定的堆栈相同(具有原始值和相同的顺序)。 我已经开始做了,但不幸的是,效果不好: 提前谢谢。

  • 我想比较两个数组,看看它们是否有相同的值。 如果我有一个数组,名为 以及如何将坐标放入“coords”变量(哦,等等,它被称为“ship”,而不是coords。我忘了): //arr.add(new javax.vecmath.vector3f(float.parsefloat(x),float.parsefloat(y),float.parsefloat(z));}谢谢!

  • 问题内容: Swift中是否有一个函数可以检查数组的所有元素是否具有相同的值?就我而言,它是一个type数组。我知道我可以使用一个简单的for循环对其进行迭代,我只是想知道是否内置了某些东西并且速度更快。 问题答案: 任何方法都必须遍历所有元素,直到找到另一个元素: 可以使用以下函数来代替显式循环: 如果数组元素是(例如),则可以从数组元素创建一个(从Swift 1.2开始可用),并检查它是否恰好

  • 我想用Java做一个小游戏swing,但我想不出一个解决问题的好方法。我有两个阵列,第一个是板条箱 第二个是Tile对象。 我想检查一下是否所有的板条箱都放在瓷砖上。我的意思是,不管哪个盒子在哪个瓷砖上,都有几个盒子,几个瓷砖,每个盒子都应该放在一块瓷砖上,不管哪个盒子在哪个瓷砖上。在游戏中,玩家行走并移动箱子,所以他们的坐标会发生变化。瓷砖坐标不变(如果可能有帮助的话)。这将是我的停止状态。当板

  • 我有一个String类型的数组列表和一个Person类型的数组列表。其中,Person是一个仅包含包含名称的字符串的对象。 假设我这样做, 假设创建一个新的Person对象会将名称设置为“Josh”,并假设Person类具有该名称的get方法。 有没有办法检查名称数组列表中是否包含名为Josh的人。 我唯一能想到的就是这个, 现在,如果Person数组列表和names数组列表包含多个元素,如何检查

  • 问题内容: 我想检查两个数组是否相等。我的意思是:相同的大小,相同的索引,相同的值。我怎样才能做到这一点? 根据用户的建议,如果数组中的至少一个元素不同,我希望以下内容可以打印 enter ,但实际上没有。 问题答案: $arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs. $arraysA