目录
思路1:排序
使用qsort排序,然后一次比较,如果数组的一个值加一不等于后一个数组的值。
qsort 是快速排序,时间复杂度是O(n*log2 *N)。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
//消失的数字
int cmp_arr(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
//方法一 : 先排序
int Find_num_1(int str[],int len)
{
assert(str);
qsort(str,len,sizeof(int),cmp_arr);
int i = 0;
for (i = 0; i <= len-1; i++)
{
if ((str[i] + 1) != str[i + 1])
return str[i]+1;
}
}
int main()
{
int arr[] = { 6,3,2,5,4,1,8,0 };
int len = sizeof(arr) / sizeof(arr[0]);
int ret=Find_num_1(arr, len);
printf("%d ", ret);
return 0;
}
思路二:相减
从1累加到N,减去数组累加的值,最后剩的就是数组中消失的值。
即(1+2+3+……+N)- (arr[0]+arr[1]+arr[2]+……+arr[n-1]) =X
时间复杂度O(N),空间复杂度O(1)
int Find_num_2(int* arr, int len)
{
assert(arr);
int i =0 ;
int sum1 = 0;
int sum2 = 0;
for (i = 0; i <= len; i++)
{
sum1 += i;
if(i<len)
sum2 += arr[i];
else if (i == len )
{
return sum1 - sum2;
}
}
}
思路三:开辟空间
额外开辟一个空间,初始化一个完整的数组,数组中的值是几就在这个位置记录。
时间复杂度 O(N) 空间复杂度 O(N)
int Find_num_3(int* arr, int len)
{
assert(arr);
int str[100] = { 0 };
int i = 0;
for (i = 0; i < len; i++)
{
str[arr[i]]++;
}
for (i = 0; i < len; i++)
{
if (str[i] == 0)
{
return i;
}
}
}
思路四:异或
类似于找单身狗,现在0-N的完整数组中异或,然后在给定的数组中异或,剩下的就是要找的单身狗。
int Find_num_4(int* arr, int len)
{
assert(arr);
int x = 0;
int i = 0;
for (i = 0; i <= len; i++)
{
x ^= i;
}
for (i = 0; i < len; i++)
{
x ^= arr[i];
}
return x;
}