-3

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

事实:

  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++;            
   }
}

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

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

4

2 回答 2

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++;
    }
}
于 2013-05-28T09:37:03.710 回答
0

解决方案

最终我做出了正确的算法。通常,解决方案是跟踪您在计算 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;
于 2013-06-07T07:21:51.883 回答