5

我的真正目的是获取唯一出现奇数次的数组元素。所以我发现它可以通过对数组的所有元素进行异或来完成。像这样:

int[] arr = { 3, 4, 7, 7, 0, 4, 0, 7, 3 };
Console.WriteLine(arr[0] ^ arr[1] ^ arr[2] ^ arr[3] ^ arr[4] ^ arr[5] ^ arr[6] ^ arr[7] ^ arr[8]);

然而问题是数组没有给出,而是从控制台读取,因此我不知道如何在输入元素后对元素进行异或。到目前为止我可以制定的代码是:

编辑:感谢您的帮助,我设法正确完成了代码。

static void Main()
        {                
        int N = int.Parse(Console.ReadLine());
        long[] rectArray = new long[N];           

        for (int i = 0; i < N; i++)
        {
            rectArray[i] = long.Parse(Console.ReadLine());
        }
        long initial = rectArray[0]; 
        for (int i = 1; i < rectArray.Length; ++i)
        {
            initial ^= rectArray[i];
        }            
        Console.WriteLine(initial);
        }
}

PS我是真正的菜鸟,所以请耐心等待!:)

4

3 回答 3

16

与 Esailija 的答案相同,但使用foreach- 利用以下事实:0 ^ x == x对于 的所有值x

int current = 0;
foreach (int value in array)
{
    current ^= value;
}
Console.WriteLine(current);

编辑:正如评论中所指出的,LINQ 的Aggregate方法也会这样做 - 因为我们很高兴在第一步中使用前两个值,所以我们甚至不需要提供种子:

int xor = array.Aggregate((x, y) => x ^ y);
于 2012-11-28T19:52:56.700 回答
11

你可以写一个循环:

int initial = 0;
for( int i = 0; i < arr.Length; ++i ) {
    initial ^= arr[i];
}
Console.WriteLine( initial );
于 2012-11-28T19:51:10.510 回答
4
for (int i = 0; i < rectArray.Length; i++)
{                      
    sum ^= rectArray[i];
}
于 2012-11-28T19:53:56.000 回答