我正在编写一个小函数,该函数应该返回一个数组的项目与另一个数组完全在同一个位置上的数量,以及有多少项但是位于不同的位置。
该功能目前如下所示:
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;
}
如果我可以说leftarray
(1, 2, 3, 4)
和rightarray
(4, 3, 2, 2)
它返回(0, 3)
(0完全匹配,3但不同位置)
但现在问题是:
如果我将输入与leftarray
的{{1}}和(4, 3, 2, 2)
的{{1}}进行交换,则输出为rightarray
这是错误的(应该与第一个)
答案 0 :(得分:1)
您必须决定如何处理重复的元素。这就是造成这种差异的原因。重复2
意味着当交换数组时,“不同位置”计数器会递增两次。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
删除休息时间,你会得到相同的结果。
答案 3 :(得分: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;
}