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

如何计算两个未排序数组中的重复项

戴嘉珍
2023-03-14

我正在开发一个修改过的Mastermind游戏,我需要比较猜测和代码数组,并计算正确位数的数量。

它会一直工作,直到代码数组中有重复的数字。我知道这与第二个for循环和从正确的数字中减去有关。有没有办法只用循环和基本知识来修复它?

public static int getCorrectDigits(int[] code, int[] guess) {
    if (code.length != guess.length) {
        throw new IllegalArgumentException("Different lengths");
    }
    
    int correctDigits = 0;
    
    for (int i = 0; i < code.length; i++) {
        for (int j = 0; j < guess.length; j++) {
            if (guess[j] == code[i]) {
                correctDigits++;
                break;
            }
        }
    }
    
    for (int i = 0; i < code.length; i++) {
        for (int j = i + 1; j < code.length; j++) {
            if (code[i] == code[j] && code[i] != guess[j] && code[j] != guess[i]) {
                correctDigits--;
            }
        }
    }
    
    return correctDigits;
}
Code - 5 9 9 9
Guess - 0 9 9 9
Passes - 3

Code - 5 9 9 9
Guess - 9 9 0 0
Passes - 2

Code - 5 9 9 9
Guess - 0 0 9 9
Fails - 3 (should be 2)

Code - 5 9 9 9
Guess - 9 0 0 0
Fails - 0 (should be 1)

共有3个答案

曹原
2023-03-14
匿名用户

您可以从这些数组生成两个 Map,这些数组将值与其出现次数相关联。

然后迭代从< code>code数组获得的映射条目,并将其值与基于< code>guess数组创建的映射中的相应值进行比较。这将允许确定正确/错误猜测的数量。

秦联
2023-03-14

既然你提到了“只使用循环和基础知识”,我想这里不包括像地图这样的概念,“基础知识”指的是“数组”。

如果您需要知道的是位数,请尝试将输入转换为10个元素的计数数组,即每个数字都是输入。

示例:

int[] codeDigits = new int[10];
for (int i = 0; i < code.length; i++) {
   codeDigits[code[i]]++;
}

这将把[5,9,9,9]变成[0,0,0,0,0,1,0,3],即5:1x,9:3x

现在同样进行猜测,例如< code>[0,0,9,9]变成< code>[2,0,0,0,0,0,0,2]。

现在你所要做的就是计算位数:

int counter = 0;
for( int i = 0; i < codeDigits.length; i++ ) {
  if( codeDigits[i] >= guessDigits[i] ) {
    counter += guessDigits[i]; //guessed the exact number or less -> use the guess
  } else {
     counter += codeDigits[i]; //guessed more -> use the code
  }
}

如果您能够使用Math函数,那么循环体可以替换为counter=Math。min(代码数字[i],guessDigits[i])

陶乐生
2023-03-14

有几种解决方案。其中之一是索引代码数组的重复值,然后在第一个循环中检查它们(并删除第二个循环):

int correctDigits = 0;
int[] duplicateIndexes = new int[code.length];
for (int i=0; i < code.length; i++) {
    if( duplicateIndexes[i] == 1) continue;
    for (int j=0; j < code.length; j++) {
        if( core[i] == core[j]) {
             duplicateIndexes[j] == 1;
             continue;
        }
    }
 }

for (int i = 0; i < code.length; i++) {
    if (duplicatedIndexes[i] == 1) continue;
    for (int j = 0; j < guess.length; j++) {
        if (guess[j] == code[i]) {
            correctDigits++;
            break;
        }
    }
}
 类似资料:
  • 我需要一个函数来接收arrayList并返回一个新的arrayList,其中包含大小相同的整数。His元素将表示原始数组中索引i中的值的重复序列数(外观数)。 1单个外观也将被视为一个序列。例如:arr[1,1,0,1]- 输入:它不必是排序数组 函数示例: arr[3,0,1,2,1,1,1,3]▪×输入:(arr)▪×输出:newArray[2,1,2,1,2,2,2,2]因为'3'在序列中出

  • 问题内容: 我想计算数组中每个重复项的出现,最后得到一个唯一的/非重复项及其各自出现的数组。 这是我的代码;但是我没有错! 问题答案: , 请享用 :-) 结果:

  • 在JavaScript中,我生成了一个x个数组,所有数组由57个数字组成。我想计算数组中每个数字的平均值,作为一个数组的平均值,即: array1[0]array2[0]array3[0]…./阵列数=[0]的平均值 array1[1]阵列2[1]阵列3[1]…./阵列数=[1]的平均值 数组一数组二数组三数组二..../数组数量=平均值[2] 这是生成的数组数组的示例: 谁能给我一个例子,让我可

  • 本文向大家介绍PHP程序计算两个数字的重复减法,包括了PHP程序计算两个数字的重复减法的使用技巧和注意事项,需要的朋友参考一下 要计算两个数字的重复减法,代码如下- 示例 输出结果 定义了一个名为“ repeated_sub”的函数,该函数检查两个值是否完全相除,如果为真,则将数字相除并给出商的下限值。否则,它将给出商的下限值和通过对第二个值调用'repeated_sub'函数而计算出的值,以及在

  • 问题内容: 我有一个数组如下 预期结果 尝试如下 问题答案: 无需使用jQuery即可完成此任务-此示例将构建一个对象,其中包含数组中每个不同元素的出现次数

  • 问题是== 将nums1和nums2合并到一个按非递减顺序排序的数组中。 最终排序的数组不应由函数返回,而应存储在数组 nums1 中。为了适应这种情况,nums1 的长度为 m n,其中前 m 个元素表示应合并的元素,最后 n 个元素设置为 0 并应忽略。nums2 的长度为 n。 我的代码中有什么错误??? 您的意见 我的产出 预期产出