c语言力扣题目:消失的数字(有关时间复杂度O(N²)O(N))以及对异或操作符的更深入的理解(如何用人脑的十进制去考量二进制)

目录

[Way One :暴力求解,时间复杂度为 O(N²)](#Way One :暴力求解,时间复杂度为 O(N²))

代码1

[Way Two : 时间复杂度限制到 O(N²)](#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;

}

简明运算图

只看红色字体就可以了

相关推荐
Antonio9153 分钟前
【CMake】使用CMake在Visual Studio内构建多文件夹工程
开发语言·c++·visual studio
是小Y啦16 分钟前
leetcode 106.从中序与后续遍历序列构造二叉树
数据结构·算法·leetcode
LyaJpunov16 分钟前
C++中move和forword的区别
开发语言·c++
程序猿练习生21 分钟前
C++速通LeetCode中等第9题-合并区间
开发语言·c++·leetcode
liuyang-neu26 分钟前
力扣 42.接雨水
java·算法·leetcode
一名路过的小码农31 分钟前
C/C++动态库函数导出 windows
c语言·开发语言·c++
m0_6312704033 分钟前
标准c语言(一)
c语言·开发语言·算法
万河归海42834 分钟前
C语言——二分法搜索数组中特定元素并返回下标
c语言·开发语言·数据结构·经验分享·笔记·算法·visualstudio
小周的C语言学习笔记38 分钟前
鹏哥C语言36-37---循环/分支语句练习(折半查找算法)
c语言·算法·visual studio
Messiah___39 分钟前
【论文阅读】Slim Fly: A Cost Effective Low-Diameter Network Topology 一种经济高效的小直径网络拓扑
开发语言·php