一、有99个不重复的正整数组成的无序数组,数值范围是1~100,求出缺失的一个1~100中的正整数。
解:
1.对1~100这100个数字求和,得到sum;
2.用sum依次减去无序数组中的每个值,最后sum的值就是缺失的那个正整数。
public static int findNum(int[] arr, int len)
{
int sum = 0;
for (int i = len - 1; i >= 0; i--)
{
sum += i;
}
for (int i = 0; i < arr.Length; i++)
{
sum -= arr[i];
}
return sum;
}
二、一个无序数组里有若干个正整数,范围是1~100,其中99个都出现了偶数次,只有一个出现了奇数次,找出这个出现奇数次的数。
解:
1.定义一个初始值为0的整数num;
2.用num依次异或每一个数;
3.num的最终值就是那个出现奇数次的数。
public static int findNum2(int[] arr)
{
int num = 0;
foreach (int value in arr) {
num ^= value;
}
return num;
}
三、如果上面一题中有两个出现了奇数次的数,找出这两个数。
解:
1.先依次异或,得到num;
2.找出num中任意一个非0的位置,设该位置为x;
3.要找的两个数的x位置必然不相等,所以通过x位置的不同,将数组中的数据分成两部分;
4.要找的两个数必然被分到了这两部分中,按照上一题的方式即可求解。
public static int[] findNum2(int[] arr)
{
int num = 0;
foreach (int value in arr) {
num ^= value;
}
// 找的位置x的(n是x的权)
int n = 1;
// 按位与,不等于0的时候就是不为0的位置了
while (0 == (num & n))
{
n <<= 1;
}
int[] res = {0, 0};
foreach (int value in arr)
{
if (0 == (value & n))
{
res[0] ^= value;
}
else {
res[1] ^= value;
}
}
return res;
}