1

我目前正在编写一个小函数,它应该返回一个数组中有多少项与另一个数组完全相同,以及有多少项位于不同的位置。

该功能目前看起来像这样:

public static int[] numCorrects(char[] leftarray, char[] rightarray){
    int counter[] = new int[2];
    counter[0] = 0;
    counter[1] = 0;

    for (int i = 0; i < leftarray.length; i++) {
        if(leftarray[i]==rightarray[i]) counter[0]++;
        else {
            for (int n = 0; n < leftarray.length; n++) {
                if (leftarray[i] == rightarray[n] && leftarray[n] != rightarray[n]) {
                    counter[1]++;
                    break;
                }
            }
        }
    }
    return counter;
}

如果我可以说leftarrayof(1, 2, 3, 4)rightarrayof(4, 3, 2, 2)

它返回(0, 3)(0 完全匹配,3 在那里但在不同的位置)

但现在的问题是:

leftarray如果我将输入与of(4, 3, 2, 2)和输出交换rightarray是错误的(应该与第一个相同)(1, 2, 3, 4)(0, 4)

希望任何人都可以帮助我。谢谢

4

4 回答 4

1

您必须决定如何处理重复的元素。这就是造成差异的原因。重复2意味着“不同位置”计数器在交换数组时增加两次。

于 2013-09-27T12:00:16.297 回答
0

试试这个:

public static int[] numCorrects(char[] leftarray, char[] rightarray){
    int counter[] = new int[2];
    counter[0] = 0;
    counter[1] = 0;
    boolean taken[] = new boolean[rightarray.length];
    for (int i=0;i<taken.length;i++)
        taken[i] = false;

    for (int i = 0; i < leftarray.length; i++) {
        if(leftarray[i]==rightarray[i]){ counter[0]++; taken[i] = true; }
        else {
            for (int n = 0; n < leftarray.length; n++) {
                if (leftarray[i] == rightarray[n] && leftarray[n] != rightarray[n] && !taken[n]) {
                    taken[n] = true;
                    counter[1]++;
                    break;
                }
            }
        }
    }
    return counter;
}
于 2013-09-27T12:07:22.220 回答
0

删除中断,您将获得相同的结果。

于 2013-09-27T12:07:33.560 回答
0
public static int[] numCorrects(char[] leftarray, char[] rightarray){
    int counter[] = new int[2];
    counter[0] = 0;
    counter[1] = 0;
    boolean taken[] = new boolean[rightarray.length];
    for (int i=0;i<taken.length;i++)
        taken[i] = false;

    for (int i = 0; i < leftarray.length; i++) {
        if(leftarray[i]==rightarray[i])
        {
            counter[0]++;
            taken[i]=true;
        }
    }

    for (int i = 0; i < leftarray.length; i++)
    {
        if (!taken[i])
        {
            for (int j = 0; j < rightarray.length; j++) {
                if (leftarray[i] == rightarray[j] && i!=j && !taken[j]) { // you can remove i!=j because its already don't apply because of !taken[i]
                    taken[j] = true;
                    counter[1]++;
                    break;
                }
            }
        }
    }
    return counter;
}
于 2013-09-27T12:17:09.020 回答