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;

}

简明运算图

只看红色字体就可以了

相关推荐
Envyᥫᩣ3 分钟前
C#语言:从入门到精通
开发语言·c#
九圣残炎20 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
童先生24 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu26 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会1 小时前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??1 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
远望清一色1 小时前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言