查找数组中没有对的数字

and*_*e91 3 c# arrays

我遇到一小段代码的麻烦,这是一个随机大小的数组,带有随机数对,但没有一对。

我需要找到没有配对的号码。

arLength是数组的长度。但我在实际匹配线对时遇到了麻烦,并找到了没有线对的那个..

 for (int i = 0; i <= arLength; i++)
        { // go through the array one by one..
            var number = nArray[i];

            // now search through the array for a match.
            for (int e = 0; e <= arLength; e++)
            {
                if (e != i)
                {

                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

我也尝试过这个:

var findValue = nArray.Distinct();
Run Code Online (Sandbox Code Playgroud)

我已经搜索过了,但是到目前为止,我还没有找到一种方法。

这段代码是生成数组的原因,但是这个问题不是关于代码的这一部分,只是为了清楚起见。

Random num = new Random();
            int check = CheckIfOdd(num.Next(1, 1000000));
            int counter = 1;

            while (check <= 0)
            {
                if (check % 2 == 0)
                {
                    check = CheckIfOdd(num.Next(1, 1000000)); ;
                }
                counter++;
            }
            int[] nArray = new int[check];
            int arLength = 0;
            //generate arrays with pairs of numbers, and one number which does not pair.
            for (int i = 0; i < check; i++)
            {
                arLength = nArray.Length;

                if (arLength == i + 1) 
                {
                    nArray[i] = i + 1;
                }
                else
                {
                    nArray[i] = i;
                    nArray[i + 1] = i;
                }
                i++;
            }
Run Code Online (Sandbox Code Playgroud)

Sch*_*uca 5

您可以使用bitwise运算符进行操作^,复杂度为O(n)

理论

运算符^又称为xor下表:

在此处输入图片说明

因此,假设您只有一个不带对的数字,则所有对都将被简化,因为它们是相同的。

var element = nArray[0];

for(int i = 1; i < arLength; i++) 
{
    element = element ^ nArray[i];
}
Run Code Online (Sandbox Code Playgroud)

最后,变量element将是不成对的数字。

  • 这是最快也是最聪明的方法^ (2认同)

Ofi*_*ten 5

Distict会给你返回具有不同值的数组。它不会找到您需要的值。

您可以GroupBy选择模 2 等于 1 的值Count

var noPairs = nArray.GroupBy(i => i)
                    .Where(g => g.Count() % 2 == 1)
                    .Select(g=> g.Key);
Run Code Online (Sandbox Code Playgroud)