【问题标题】:Specific comparison of two arrays in javajava中两个数组的具体比较
【发布时间】:2013-05-28 09:27:36
【问题描述】:

有很多符号游戏都以这种方式工作,所以这对您来说应该很熟悉。

事实:

  1. 我有两个相同长度为 4 的数组。 (A[4] 和 B[4])

  2. 我用 1 到 6 的随机整数填充它们。

  3. 我无法以任何方式对它们进行排序(它们必须保持不变)。

问题:

我需要比较它们,然后我需要有 3 个值。第一个需要计算在同一个地方有多少相同的元素。我这样做并且它正在工作:

int first = 0;
int k = 0;
for (int j=1; j<=4; j++)
{
k++;
if (A[k] == B[j])
   {
    first++;            
   }
}

第二个需要计算有多少元素相同但不在同一个地方。第三个需要计算有多少元素根本不一样。

我需要一个解决方案来计算第二个或第三个数字,因为在那之后我可以像 4-(first+second)4-(first+second) 一样减去。

【问题讨论】:

  • 您的第一个解决方案是错误的。您需要有一个嵌套循环,该循环针对第二个数组上的所有元素上的第一个数组上的每个元素运行。另一件事,数组是零基数,你的循环应该从0到3开始。
  • @MarounMaroun:除了索引,第一种解决方法是正确的。
  • 是的,第一个解决方案是正确的,除了索引 j 应该以 0 开头。
  • 这是为了一些算法难题吗?因为你的建议运行在 O(n^2)
  • I need a solution to count either...。你试过什么?

标签: java arrays algorithm


【解决方案1】:

这是您应该使用的逻辑:循环第一个数组;对于每个元素,检查第二个数组的对应元素是否相同 - 如果是,则增加您的 first 计数器。如果不相同,则检查第二个数组是否包含第一个数组的对应元素。如果是这样,那么它肯定不在同一个位置(您只是检查了相同的位置) - 增加您的 second 计数。否则,增加您的 third 计数。代码如下:

int[] A = {...};
int[] B = {...};

List<Integer> lstB = new ArrayList<Integer>(B.length);
for (int index = 0; index < B.length; index++) {
    lstB.add(B[index]);
}

int first = 0, second = 0, third = 0;

for(int i=0; i<4; i++) {
    if(A[i] == B[i]) {
        first++;
    }
    else if(lstB.contains(A[i]) {
        second++;
    }
    else {
        third++;
    }
}

【讨论】:

  • 由于使用了int[] 而不是Integer[],这不会像您预期的那样工作。无论B 的长度是多少,您的lstB 的大小都是1。
  • @jlordo 是的,我明白了。我会在一秒钟内改变答案
  • 这不起作用。检查算法,例如 A{1,4,4,4} 和 B{5,4,1,1}。
【解决方案2】:

解决方案

最终我做出了正确的算法。通常,解决方案是跟踪您在计算 FIRST 值时使用的字段。这是代码:

int first = 0;
int second = 0;
int third = 0;

boolean[] codeUsed = new boolean[4];
boolean[] guessUsed = new boolean[4];

//same value and same place
for (int i = 0; i < 4; i++) 
    {
       if (A[i] == B[i]) 
       {
          first++;
          codeUsed[i] = guessUsed[i] = true;
       }
    }

//same value but not right place
for (int i = 0; i < 4; i++) 
   {
   for (int j = 0; j < 4; j++) 
      {
      if (!codeUsed[i] && !guessUsed[j] && A[i] == B[j])
         {
            second++;
            codeUsed[i] = guessUsed[j] = true;
            break;
         }
       }
    }

//not the same value
third = 4 - first - second;

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 2013-01-31
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    相关资源
    最近更新 更多