目录
Way One :暴力求解,时间复杂度为 O(N²)
代码1
Way Two : 时间复杂度限制到 O(N²)
代码及其详解
如题
Way One :暴力求解,时间复杂度为 O(N²)
大体思路:比如这里我们需要处理的整型数组是"3,0,1",我们可以用冒泡排序或者 qsort函数将他从大到小进行排序成"0,1,3"然后生成一个数组"0,1,2"
代码1
过于简单:不多进行赘述
int cmp(const void*p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}int disapperance(int* arr, int sz)
{int i = 0;int j = 0;int tarr[] = { 0 };for (j = 0; j <sz; j++){while (1){if (arr[i] == j){i++;j++;}else{printf("%d ", j);}break;}}
}
int main()
{int arr[3] = { 3,0,1 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp);int i = 0;disapperance(arr, sz);return 0;
}
运行结果
目录
Way Two : 时间复杂度限制到 O(N)
个人感觉这个时间复杂度O(N)的题目思路有点类似于"单生狗"
思路是这样的:首先我们得明确知道的前提条件就是异或运算符是有交换律的,比如"1^1^4^4=0",但是也可以说"1^4^1^4==0"
这一题给我们一个数组"0,3,1",找出缺少的数字2
观察法可知,题目的意思是让我们和有限有序数组数组"0,1,2,3"进行对比,找出数字"2",这个时候就得想办法让两个数组进行异或:"0^1^3^0^1^2^3=2"了
这个题目大体思路就是使用题目给的那个乱序的数字数组和我们创造的有序数组进行异或
代码及其详解
int disnum(int* arr, int sz)
{
int x = 0;
for (int i = 0; i < 3; i++)
{
x = x ^ arr[i]; //好像要将一个字符串先赋值给"x"然后再和我们自己创造的有序数组进行异或找出缺失的数字,
//计算机对数字进行异或运算都是基于数字的补码然后使用"相同为零,相异为一"进行计算的,
//然后基于此理论得到一个结论,在十进制里面"相同的数字异或为'0',0异或任何数字都等于这个任意数的本身
//
//在进行大量的计算与观察后,我们得出了一条<结论>,使我们的思维可以更好地适应计算机的二进制计算(这个结论可以自己去推导,这里不进行推论)
//
//也就是说有关异或 计算机在进行异或计算的时候确实会每一个阶段都得到一个值然后带入下一步
//但是我们大脑不是二进制,是十进制的
//所以我们人脑去考量的话应该这么去思考:就是不到有关异或计算的最后一步都不可以把这个数值表达式算到只剩一个数
//就像上面一个for循环计算机确实得到了一个数 但是我们大脑中只能是0^1^3这么一个数值表达式//然后我们这里即想要将arr[i]放入一个变量又不想改变它本身,因为0异或任何数字就等于这个数本身,所以是设置int x=0;
}
int j = 0;
for (int i = 0; i <= 3; i++)
{
x=x^i;//然后将上面的for循环生成的那一串长数字按着这个循环与i不停的递归,相同为0,相异为1,最后是只有2了
}
return x;
}
int main()
{
int arr[10] = { 0,1,3 };
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = disnum(arr, sz);
printf("%d", ret);
return 0;
}
简明运算图
只看红色字体就可以了