我遇到了一篇帖子How to find a duplicate element in an array of shuffled consecutive integers?,但后来发现很多输入都失败了。
例如:
arr[] = {601,602,603,604,605,605,606,607}
#include <stdio.h>
int main()
{
int arr[] = {2,3,4,5,5,7};
int i, dupe = 0;
for (i = 0; i < 6; i++) {
dupe = dupe ^ a[i] ^ i;
}
printf ("%d\n", dupe);
return 0;
}
如何修改此代码,以便能够找到所有案例的重复元素?
答案 0 :(得分:18)
来自原始问题:
假设您有一个1001个整数的数组。整数是随机顺序,但您知道每个整数在1到1000之间(包括1和1000)。此外,每个数字在数组中只出现一次,但一个数字除外,它出现两次。
它基本上说,只有当你有连续的整数,以1 开头,以某些N结尾时,该算法才有效。
如果您想将其修改为更一般的情况,您必须执行以下操作:
查找数组中的最小值和最大值。然后计算预期输出(xor最小值和最大值之间的所有整数)。然后计算数组中所有元素的xor。然后xor这两件事你得到一个输出。
答案 1 :(得分:9)
XOR语句具有'a'XOR'a'始终为0的属性,即它们被取消,因此,如果您知道您的列表只有一个副本并且范围是x到y,在你的情况下,601到607,可以在变量中保持x到y中所有元素的xor,然后使用数组中的所有元素xor这个变量。由于只有一个元素会被复制,因此不会因为xor操作而被取消,这将是你的答案。
void main()
{
int a[8]={601,602,603,604,605,605,606,607};
int k,i,j=601;
for(i=602;i<=607;i++)
{
j=j^i;
}
for(k=0;k<8;k++)
{
j=j^a[k];
}
printf("%d",j);
}
此代码将根据需要提供输出605!
答案 2 :(得分:2)
以下是原始问题中显示的代码,它与您的实现不同。您已将其修改为使用局部变量而不是数组的最后一个成员,这会产生影响:
for (int i = 1; i < 1001; i++)
{
array[i] = array[i] ^ array[i-1] ^ i;
}
printf("Answer : %d\n", array[1000]);
答案 3 :(得分:2)
//There i have created the program to find out the duplicate element in array. Please edit if there are required some changes.
int main()
{
int arr[] = {601,602,603,604,605,605,606,607};
//int arr[] = {601,601,604,602,605,606,607};
int n= sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
int res = arr[i] ^ arr[j];
if (res == 0)
{
std::cout<< "Repeated Element in array = "<<arr[i]<<std::endl;
}
}
}
return 0;
}
// OR您输入相同的时间可以使用HashTable和Hash函数
如果值大于
,则可以计算哈希表中的值
在HashTable的特定索引处有一个值,那么你可以说数组中有重复的值。
答案 4 :(得分:2)
记住XOR运算符的这两个属性:
(1)如果对数字0(零)进行异或运算,它将再次返回相同的数字。
均值,n ^ 0 = n
(2)如果将数字与xor一起使用,它将返回0(零)。
平均值,n ^ n = 0
现在,要解决这个问题:
Let Input_arr= { 23 , 21 , 24 , 27 , 22 , 27 , 26 , 25 }
Output should be 27 ( because 27 is the duplicate element in the Input_arr ).
解决方案:
步骤1:在给定数组中找到“最小”和“最大”值。需要O(n)。
第2步:找到所有从“最小”到“最大”(含)范围内的整数的异或。
第3步:找到给定数组所有元素的XOR。
第4步:对第2步和第3步进行XOR运算,得到所需的重复编号。
说明:
Step1 : min = 21 , max = 27
Step 2 : Step2_result = 21 ^ 22 ^ 23 ^ 24 ^ 25 ^ 26 ^ 27 = 20
Step 3 : Step3_result = 23 ^ 21 ^ 24 ^ 27 ^ 22 ^ 27 ^ 26 ^ 25 = 15
Step 4 : Final_Result = Step2_result ^ Step3_result = 20 ^ 15 = 27
But , How Final_Result calculated the duplicate number ?
Final_Result= ( 21 ^ 22 ^ 23 ^ 24 ^ 25 ^ 26 ^ 27 ) ^ ( 23 ^ 21 ^ 24 ^ 27 ^ 22 ^ 27 ^ 26 ^ 25 )
Now , Remember above two properties : n ^ n = 0 AND n ^ 0 = n
So , here ,
Final_Result= ( 21 ^ 21 ) ^ ( 22 ^ 22 ) ^ ( 23 ^ 23 ) ^ ( 24 ^ 24 ) ^ ( 25 ^ 25 ) ^ ( 26 ^ 26 ) ^ ( 27 ^ 27 ^ 27 )
= 0 ^ 0 ^ 0 ^ 0 ^ 0 ^ 0 ^ ( 27 ^ 0 ) ( property applied )
= 0 ^ 27 ( because we know 0 ^ 0 = 0 )
= 27 ( Required Result )
答案 5 :(得分:0)
尽管此处提供的答案很好,但是如果有歧义,我希望您使用Mohit Jain来引用答案。
事实variable xor variable = zero
可用于精确而轻松地定位数组中存在的重复项。希望有帮助!