寒假题练——day(4)

news2024/12/28 19:30:38

题目 1

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

编写一个函数找出这两个只出现一次的数字。

#include<stdio.h>
int main()
{
	int arr[] = { 1, 3, 8, 1, 3, 8, 4, 6 };
	int num = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	int pos = 0;
	int x = 0;
	int y = 0;
	for (i = 0; i < sz; i++)//异或
	{
		num ^= arr[i];
	}
	printf("num=%d\n");
	for (i = 0; i < 32; i++)//找num的二进制中为1的一个为pos
	{
		if (1 == (num >> i) & 1)
		{
			pos = i;
			break;
		}
	}
	for (i = 0; i < sz; i++)//分组
	{
		if (((arr[i] >> pos) & 1) == 1)
		{
			x ^= arr[i];
		}
		else
		{
			y ^= arr[i];
		}
	}
	printf("x=%d y=%d\n", x, y);
	system("pause");
	return 0;
}

题目2:

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

思路:两个数相加可以看成,每个位数上的数相加但不进位,然后再和进位的数相加。

先思考十进制的数:如18+5 看成1+0=1 8+5=3得到13和进一个十位数10,然后再13+10,
可以看成1+1=2 3+0=3得到23,进位为0,所以结束,得到最后的结果。

然后看二进制的数:3+3 3: 00000011
0+0=0,1+1=0,1+0=1——这相当于按位亦或的到未进位的数 ;
在二进制中,逢二进一,如11+11=110,可以看成11&11=11 11<<1=110
3+3看成 00000011+00000011=00000000 00000011<<1=00000110 00000000+00000110=00000110为6

int Add(int num1, int num2)
{
    while (num2 != 0)//进位为0的时候退出循环
    {
        int tmp = num1 ^ num2;//按位亦或——没有进位的相加
        num2 = num1 & num2 << 1;//得到进位的数
        num1 = tmp;//num1接受没有进位相加的结果
    }
    return num1;
}

题目3:

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。
请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

低级算法:

低阶方法
#include<stdlib.h>
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{
    *returnSize = 0;
    int count = 0;
    int* p = (int*)calloc(numsSize, sizeof(int));
    int* q = (int*)calloc(numsSize, sizeof(int));
    for (int i = 0; i < numsSize; i++)
    {
        int j;
        for (j = 0; j < count; j++)
        {
            if (nums[i] == p[j])
            {
                break;
            }
        }
        if (j == count)
        {
            p[count] = nums[i];
            count++;
        }
    }
    for (int i = 1; i <= numsSize; i++)
    {
        int j;
        for (j = 0; j < count; j++)
        {
            if (i == p[j])
                break;
        }
        if (j == count)
        {
            q[*returnSize] = i;
            (*returnSize)++;
        }
    }
    return q;
}

进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗?
你可以假定返回的数组不算在额外空间内。

思路:将数组元素的数据取绝对值减一后作为下标,因为数据的取值是[1,n],而数组下标的取值是[0,n-1]
将找到的元素,如果是正数,则置为负数,否则不变。
最后未出现负数的元素,下标加1就是在数组中未出现的数

例子:
[2, 3, 3, 2, 4] 注意数组10个元素,值为[1-10],
但是访问下标应该在[0-9]之内,因此修改位置下标应该是值-1
0号元素是2,则将1号位置置为对应负值 [2, -3, 3, 2, 4]
1号元素是3,则将2号位置置为对应负值 [2, -3, -3, 2, 4]
2号元素是-3,绝对值为3,将2号位置为负值,但是2号位已经重置过,不需要重置,
否则会变正数[2, -3, -3, 2, 4]
3号元素是-2,绝对值为2,将1号位置为负值,但是1号位已经重置过,不需要重置,
否则会变正数[2, -3, -3, 2, 4]
4号元素是4,则将3号位置置为对应负值 [2, -3, -3, -2, 4]
遍历数组得到0,4两个位置的数据是大于0的,因为人家数值从1开始,因此+1后得到1, 5两个缺失的数字。

int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{
	*returnSize = 0;
	for (int i = 0; i < numsSize; i++)
	{
		int tmp;
		if (nums[i] < 0)
		{
			tmp = -nums[i];
		}
		else
		{
			tmp = nums[i];
		}
		if (nums[tmp-1] > 0)
		{
			nums[tmp-1] *= -1;
		}
	}
	int* p = (int*)calloc(numsSize, sizeof(int));
	for (int i = 0; i < numsSize; i++)
	{
		if (nums[i] > 0)
		{
			p[*returnSize] = i + 1;
			(*returnSize)++;
		}
	}
	return p;

标准答案:

//标准答案
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
	for (int i = 0; i < numsSize; i++) {
		if (nums[abs(nums[i]) - 1] > 0)
			nums[abs(nums[i]) - 1] = -(nums[abs(nums[i]) - 1]);
	}
	int* ret = (int*)malloc(sizeof(int) * (numsSize));
	*returnSize = 0;
	for (int i = 0; i < numsSize; i++) {
		if (nums[i] > 0) {
			ret[*returnSize] = i + 1;
			*returnSize += 1;
		}
	}
	return ret;
}

abs函数——头文件stdlib.h

int abs (int n);

用途:对一个整数取绝对值
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】六、Linux 基础IO(二)|重定向|如何理解 Linux一切皆文件|缓冲区

目录 五、重定向 5.1 什么是重定向 5.2 系统调用 dup2 5.3 三种重定向测试 5.3.1 输出重定向(>) 5.3.2 追加重定向(>>) 5.3.3 输入重定向(<) 5.4 父子进程拷贝问题 六、如何理解 Linux一切皆文件 七、缓冲区 7.1 认识缓冲区 7.2 缓冲区的刷新策略 …

连续系统PID的Simulink仿真-2

仍以二阶线性传递函数为被控对象&#xff0c;进行模拟PID 控制。被控对象形式为,其中b为在[103,163]范围内随机变化&#xff0c;a为在[15,35]范围内随机变化&#xff0c;则被控对象的描述方式可转换为&#xff1a;S函数是Simulink一项重要的功能&#xff0c;采用S函数可实现在S…

Pandas 数据清洗

Pandas 数据清洗数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况&#xff0c;如果要对使数据分析更加准确&#xff0c;就需要对这些没有用的数据进行处理。在这个教程中&#xff0c;我们将利用 Pandas包来进行数…

微软ATP带你看| 爆火的ChatGPT是什么?

&#xff08;本文阅读时间&#xff1a;7分钟&#xff09;OpenAI最新聊天机器人ChatGPT火爆全网&#xff01;能写代码、编剧本&#xff0c;马斯克都盛赞它“好得吓人”&#xff01;ChatGPT是什么GPT(Generative Pre-trained Transformer)系列是由OpenAI提出的非常强大的预训练语…

MaxCompute SQL示例解析

MaxCompute SQL示例解析 介绍MaxCompute SQL常见使用场景&#xff0c;掌握SQL的写法。 准备数据集 本文以emp表和dept表为示例数据集。您可以自行在MaxCompute项目上创建表并上传数据。 emp.csv中数据如下 7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,20 7499,ALLEN,SALES…

aws codebuild 使用和配置codebuild测试报告

参考资料 使用 Amazon CodeBuild 中的测试报告在 CodeBuild 使用AWS CLI样本中创建测试报告aws-codebuild-samples 在codebuild构建过程中获取有关在构建期间运行的测试的详细信息。 codebuild测试报告 通过在buildspec.yaml中配置报告组&#xff0c;运行构建项目时系统将运…

【代码随想录】96.不同的二叉搜索树

96.不同的二叉搜索树 思路 n为1的时候有一棵树&#xff0c;n为2有两棵树&#xff0c;这个是很直观的。 n为3的时候&#xff0c;有哪几种情况。 当1为头结点的时候&#xff0c;其右子树有两个节点&#xff0c;看这两个节点的布局&#xff0c;是不是和 n 为2的时候两棵树的布…

控价公司可以帮我们做什么?什么时候需要找第三方控价公司?

如果&#xff0c;我们品牌的销售渠道遭遇了低价乱价、窜货、侵权、假冒等问题&#xff0c;扰乱了我们品牌的渠道秩序&#xff0c;或者是我们在品牌发展的过程中&#xff0c;想通过对行业和竞品的了解来明确发展方向和策略&#xff0c;而自己又分身乏术或无从下手&#xff0c;这…

车辆信息查询

要想查一辆汽车的信息&#xff0c;除了去各个汽车平台上查询&#xff0c;比如汽车之家、易车网、懂车帝等&#xff0c;还可以使用“汽车公告查询”。 通过常规网页百度搜索引擎&#xff0c;输入关键字“汽车公告查询”&#xff0c;就会获取到相关搜索结果&#xff0c;汽车公告查…

C进阶_内存库函数

目录 memcpy 模拟实现memcpy memmove 模拟实现memmove memcmp memcpy 它的函数原型为&#xff1a; void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数…

104、【树与二叉树】leetcode ——98. 验证二叉搜索树:递归法[先序+中序+后序]+迭代法(C++版本)

题目描述 原题链接&#xff1a;98. 验证二叉搜索树 解题思路 BST的特点是&#xff1a;当前结点的值&#xff0c;比左子树中的全部结点都大&#xff0c;比右子树中全部结点都小。在代码实现中&#xff0c;要注意不要对比的是某一结点和某一侧的全部值之间的关系&#xff0c;不…

【论文阅读】CenterNet

论文题目&#xff1a;Objects as Points&#xff08;CVPR2019&#xff09; 论文地址&#xff1a;https://arxiv.org/pdf/1904.07850.pdf 发布时间&#xff1a;2019.4.16 机构&#xff1a;UT Austin&#xff0c;UC Berkeley 代码&#xff1a;https://github.com/xingyizhou/…

小程序事件基础

小程序事件--基础小程序事件事件简介小程序事件—事件传参事件对象属性target和currentTarget事件对象属性获取和设置data数据获取&设置data获取和设置data数据—进阶小程序的渲染层与逻辑层小程序事件 事件简介 事件是视图层到逻辑层的通讯方式。负责将用户对于的页面的操…

云上的米开朗基罗:在不确定时代,寻找建筑般的确定性

文艺复兴三杰之一的米开朗基罗&#xff0c;被称为“天才建筑师”。其实他一生留下的建筑并不多&#xff0c;仅仅有美第奇礼拜堂、卡比多广场、圣彼得大教堂穹顶等寥寥几座。但米开朗基罗却凭借对建筑层次与结构的精妙把握&#xff0c;影响了此后数百年的建筑风格。很多人认为&a…

【代码随想录】动态规划:关于01背包问题,你该了解这些!(滚动数组)

01 背包 有n件物品和一个最多能背重量为w的背包 第i件物品的重量是weight[i]&#xff0c; 得到的价值是value[i] &#xff0c; 每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 每一件物品其实只有两个状态&#xff0c;取或者不取&#xff0c;所以…

win下编译opencv+libjpeg-turbo

文章目录前言编译环境下载opencv和jpeg-turbo源码编译jpeg-turbo编译opencv失败&#xff1f;那就直接调用jpeg-turbo库进行编解码前言 opencv默认自带第三方jpeg编解码库&#xff0c;但其性能一般&#xff0c;对高性能需求的程序来说是不适合的&#xff0c;因此我们可以把jpeg…

设计模式学习(八):Proxy代理模式

一、什么是Proxy模式 Proxy是“代理人”的意思&#xff0c;它指的是代替别人进行工作的人。当不一定需要本人亲自进行工作时&#xff0c;就可以寻找代理人去完成工作。但代理人毕竟只是代理人&#xff0c;能代替本人做的事情终究是有限的。因此&#xff0c;当代理人遇到无法自己…

文件上传oss,并查询上传进度(SpringBoot+Redis+Oss+Swagger3)

文章目录诉求技术选型pom配置项目结构文件树图示结构代码实现配置相关配置文件yamlSwagger3配置跨域问题配置oss相关ServiceControllerApplicationSwagger接口操作获取上传文件标识号获取文件上传进度小结诉求 将文件上传到oss&#xff0c;并实时监听上传进度&#xff0c;并将进…

【javaSE】中基本类型和引用类型对象的比较及PriorityQueue中的比较方法

写博客是为了提升自己&#xff0c;也是为了展现自己的学习成果&#xff0c;坚持!坚持!坚持&#xff01;未来是什么样的&#xff0c;闯一闯就知道啦。喜欢就留个关注吧&#xff01;&#xff01;! 目录 一、java对象的比较 1.1java中基本类型的比较 1.2引用对象的比较 1.3引用…

使用云端的GPU进行yolov5的训练

前言本文介绍了使用云端GPU进行yolov5训练环境配置的过程一、创建实例这里使用的是恒源云的GPU服务器&#xff0c;官方网址为恒源云_GPUSHARE-恒源智享云他的用户文档为Tmux - 恒源云用户文档一般的问题在用户文档中都可以找到解决办法。注册并登录后的界面如下图所示。点击云市…