我遇到一小段代码的麻烦,这是一个随机大小的数组,带有随机数对,但没有一对。
我需要找到没有配对的号码。
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)
您可以使用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将是不成对的数字。
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)