c - 如何使用 XOR 查找数组中出现次数为奇数的单个元素?

标签 c arrays algorithm

考虑这个问题:

You are given an array containing positive integers. All the integers occur even number of times except one. Find this special integer.

解决方法:

出现次数为奇数的整数将有 0 对或多对和一个单数。所以,如果我们能找到摆脱所有对的方法,那么我们剩下的就是单个数字。现在,什么摆脱了对?提示:想想一个运算符。

XOR 可以解决问题。它为您提供了没有额外内存的 O(n) 解决方案。

int GetSpecialOne(int[] array, int length)
{
    int specialOne = array[0];

    for (int i=1; i < length; i++)
    {
        specialOne ^= array[i];
    }

    return specialOne;
}

我不明白如何通过累加每个元素的 XOR 来减少数组产生特殊整数。它是如何工作的?

最佳答案

之所以有效,是因为 (N xor Q) xor Q = N。

恰好一个整数出现奇数次,因此它将是唯一没有从列表中“消失”的数字。所有其他数字出现的次数都是偶数,所以它们都以 2 为一组出现(可以想象),所以它们都“消失”了。此外,XOR 之间的“距离”无关紧要:(((N xor Z) xor Q) xor Z) xor Q = N。即使在对之间存在中间 XOR,Z 和 Q 也会“抵消” .

关于c - 如何使用 XOR 查找数组中出现次数为奇数的单个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4985970/

相关文章:

c - 将数字放入 int 但不求和

c# - 如何在 C# 中编码(marshal) IntPtr 的异常

javascript - 如何使用 jQuery 在 json 子数组中添加值?

javascript - 使用 jQuery 在 javascript 中迭代关联数组(键/值对),其中值是 jQuery 对象

php - 转置将多维数组的列值转换为平面数组

algorithm - 完美二叉树 : DSW and RB balanced trees

algorithm - 基于距离的大小为 2 的组

c - 在 C 中手动解析 JSON 消息

c - 使用 SSE2 指令集查找 3 个值的中位数

java - 哪种算法最适合我的列表管理?