【C语言经典题目】调整奇数偶数顺序、有序序列合并以及有序序列判断

news2024/11/25 10:33:12

目录

一、调整奇数偶数顺序

1.思路一(使用多个数组)

①使用两个数组(双指针法)

②使用三个数组

2.思路二(不创建其他的数组,双指针)

 二、有序数组合并

1.思路一

2.思路二

三、有序序列判断

总结


一、调整奇数偶数顺序

题目描述:

输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分

1.思路一(使用多个数组)

我们首先最容易想到的就是创建两个或者三个数组,然后将奇数都放在一个数组里面,将偶数在放在另外一个数组里面,然后将这两个数组进行合并。

①使用两个数组(双指针法)

只使用两个数组的话,第一个数组肯定是我们已经输入好的,第二个数组我们就要用来存放偶数,所以我们需要做的就是,遍历第一个数组,采用两个指针或者两个下标,假设第一个指针p1是来标记目前的奇数的,第二个指针p2就用来标记当前已经遍历到哪里了,那么就当p2找到一个奇数的时候,让p1来存放这个奇数,然后两个指针都向后一走一步,如果遇到的是偶数,那么只让p2走一步,然后将这个偶数放到第二个数组里面,如此循环下去,就可以解决问题。

这样做确实没问题,但是显得过于繁琐,读者可以自行写出代码,代码就不在这里给出了

②使用三个数组

使用了三个数组的话,那么其实思路就更加简单了,第一个数组是用来遍历的,第二个数组用来存放奇数,第三个用来存放偶数,最后这两个数组一合并也能解决问题

思路很简单,读者可以自行写出这个思路的代码

2.思路二(不创建其他的数组,双指针)

这个思路是我们重点需要去了解的,我们前面都创建了数组,那么我们可不可以不创建数组来实现这个呢?答案是可以的

我们是这样想的,我们可以定义两个指针,一个是从left,指向最左边的数组元素,另外一个是right,指向最右边的元素。因为我们是需要让奇数在前,偶数在后,所以我们可以让left从左到右去寻找偶数,找到偶数就停止,然后让right去寻找奇数,找到奇数就停止。这时候我们就得到位置,我们只需要让这两个位置的值进行交换即可。如此循环下去,只要left<right那么就可以一直比较下去。

需要注意的是,里面寻找奇数和偶数的时候也要给他们加上限制条件left<right,否则他们就可能无休止的找下去,一直越界。

代码如下:

#include<stdio.h>
#include<assert.h>
void adjust_the_order_of_odd_and_even_numbers(int* arr,int sz)
{
	assert(arr);
	//要求:奇数在全部放在前面,偶数全部放在后面,但不要求顺序
	//思路:从前往后找出一个偶数,从后往前找出一个奇数,然后将这两个进行交换即可
	int left = 0;//定义出左下标
	int right = sz - 1;//定义右下标
	while (left < right)
	{
		//实现从前往后找偶数
		while (left < right)
		{
			if (arr[left] % 2 == 0)
			{
				//找到了偶数,直接跳出循环即可,left就是偶数的下标
				break;
			}
			left++;
		}
		//实现从后往前找奇数
		while (left < right)
		{
			if (arr[right] % 2 == 1)
			{
				//找到了奇数,直接跳出循环即可,right就是奇数的下标
				break;
			}
			right--;
		}
		//交换奇数和偶数
		if (left < right) 
		{
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}

	}

}
int main()
{
	int arr[] = { 5,7,5,1,5,54,5,4546,482 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	adjust_the_order_of_odd_and_even_numbers(arr,sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果为

 二、有序数组合并

链接:有序序列合并_牛客题霸_牛客网

来源:牛客网

1.思路一

对于这道题目,我们可以使用最简单最暴力的方法,那就是不管三七二十一,先将这两个数组的元素都放到同一个数组中,然后进行排序。这样做当然是可行的,但是时间就慢了。

2.思路二

我们可以这样思考,先创建这样一个大数组,然后让这两个数组的元素一一比较,谁的元素小,谁先放到第三个数组里面,这样一直循环下去,直到其中一个数组被放完了,然后我们就将另外一个数组的元素全部补到后面即可

代码如下

#include<stdio.h>
#include<assert.h>
void MergeOrderedArrays(const int* arr1, int n, const int* arr2, int m,
    int* arr3, int len) {
    assert(arr1 && arr2 && arr3);
    int arr1_left = 0;
    int arr1_right = n - 1;
    int arr2_left = 0;
    int arr2_right = m - 1;
    int arr3_left = 0;
    int arr3_right = len - 1;

    while (arr3_left <= arr3_right) 
    {
        if (arr1_left <= arr1_right && arr2_left <= arr2_right)
        {
            //1的左下标是不可以超过他的右下标的
            //arr1的元素小于arr2的元素的时候,将arr1的元素放入arr3中,然后arr1_left++,arr3_left++
            if (arr1[arr1_left] <= arr2[arr2_left])
            {
                arr3[arr3_left] = arr1[arr1_left];
                arr1_left++;
                arr3_left++;
            }
            //2的左下标也是不可以超过他的右下标的
            //arr2的元素小于arr1的元素的时候,将arr2的元素放入arr3中,然后arr2_left++,arr3_left++
            if (arr1[arr1_left] >= arr2[arr2_left])
            {
                arr3[arr3_left] = arr2[arr2_left];
                arr2_left++;
                arr3_left++;
            }
        }
        else if (arr1_left == arr1_right+1 )
        {
            while (arr2_left <= arr2_right)
            {
                arr3[arr3_left] = arr2[arr2_left];
                arr2_left++;
                arr3_left++;
            }
        }
        else if (arr2_left == arr2_right+1 )
        {
            while (arr1_left <= arr1_right)
            {
                arr3[arr3_left] = arr1[arr1_left];
                arr1_left++;
                arr3_left++;
            }
        }
    }
}
int main() {
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr1[1000];
    int arr2[1000];
    int i = 0;
    for (i = 0; i < n; i++) {
        scanf("%d", &arr1[i]);
    }
    for (i = 0; i < m; i++) {
        scanf("%d", &arr2[i]);
    }
    int len = m + n;
    int arr3[2000];

    MergeOrderedArrays(arr1, n, arr2, m, arr3, len);
    for (i = 0; i < len; i++) {
        printf("%d ", arr3[i]);
    }
    return 0;
}

 运行结果为

三、有序序列判断

链接:有序序列判断_牛客题霸_牛客网

来源:牛客网

对于这道题,我们可以使用来个标记来完成,我们先假设这个数组既是升序又是降序的,也就是令flag1和flag2都为1,然后我们在来验证这两个是否是满足升序和降序的条件

我们先验证是否升序,也就是比较n-1次,n为数组元素个数,看看是否每一次都满足前面的元素小于等于后面的元素,只要一次不满足,他就不是升序的。我们就让flag1变为0

然后我们在来判断是否降序,比较n-1次,看看是否每一次都满足后面元素小于等于前面元素,只要有一次不满足,他就不是降序的。我们就让flag2变为0

我们只要满足任何一个flag为1,他就是有序的,只有当两个flag都为0的情况下,他才是无序的

代码为:

#include<stdio.h>
int is_sorted(int* arr, int sz)
{
    //默认是有序的
    int flag1 = 1;
    int flag2 = 1;
    int i = 0;
    //判断是否是升序的
    for (i = 0; i < sz - 1; i++)
    {
        if (arr[i] > arr[i + 1])
        {
            flag1 = 0;
            break;
        }
    }
    //判断是否是降序的
    for (i = 0; i < sz - 1; i++)
    {
        if (arr[i] < arr[i + 1])
        {
            flag2 = 0;
            break;
        }
    }
    int flag = flag1 || flag2;
    return flag;
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int arr[100];
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    int ret = is_sorted(arr, n);
    if (ret == 1)
    {
        printf("sorted");
    }
    if (ret == 0)
    {
        printf("unsorted");
    }
    return 0;
}

运行结果为:


总结

本小节讲解了三个经典的题目,交换奇数偶数次序,有序序列合并以及有序序列判断,希望大家都能理解这三个题目,如果对你有帮助,不要忘记点赞加收藏哦!!!

如果想了解更多C语言系列的精彩讲解,记得关注我哦!!!

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

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

相关文章

【springboot进阶】基于starter项目构建(二)构建starter项目-mysql

目录 一、创建 mysql-spring-boot-starter 项目 二、添加 pom 文件依赖 三、构建配置 1. mybatis-plus分页配置 MybatisPlusConfig 2. mybatis-plus代码生成器 CodeGenerator 四、加载自动化配置 五、打包 六、使用 这个系列讲解项目的构建方式&#xff0c;主要使用 父…

第二证券|事关A股!4万亿外资巨头最新研判

时值年末&#xff0c;在多重利好音讯提振下&#xff0c;我国股市迎来一波反弹&#xff0c;海外本钱大举加仓我国财物。下一年全球经济将走向何方&#xff1f;国内和海外商场又会有哪些变化&#xff1f;财物装备该怎样做&#xff1f;近期&#xff0c;联博资深商场策略师黄森玮、…

PyTorch - Cifar 数据集

文章目录项目说明cifar-10 数据集介绍代码实现构建数据集、加载器构建 卷积网络训练数据构建 VGG 加深网络训练测试项目说明 cifar-10 数据集介绍 cifar-10 数据集由 60000 张分辨率为 32x32 彩色图像组成&#xff1b; 共分为 10 类&#xff0c;每类包含 6000 张图像&#xff…

深入理解mysql的索引分类,覆盖索引,覆盖索引失效,回表,MRR

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/128273593【三】深入理解mysql的索引分类&a…

odps创建周期任务及字符串与日期函数用法

odps简介 PB/EB级数据的离线存储(存储资源)及逻辑处理(计算资源)&#xff0c;集群可用性全托管。 MaxCompute(odps)是适用于数据分析场景的企业级SaaS&#xff08;Software as a Service&#xff09;模式云数据仓库&#xff0c;以Serverless架构提供快速、全托管的在线数据仓库…

[附源码]Python计算机毕业设计SSM基于的民宿租赁系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

STS安装反编译插操作

第一步&#xff1a;下载net.sf.jadclipse_3.3.0.ja离线插件 首先​​​​​​下载离线插件 JadClipse - Eclipse plugin download | SourceForge.netDownload JadClipse - Eclipse plugin for free. Jad Java decompiler plugin for Eclipse IDE.https://sourceforge.net/proj…

Java自定义注解实现

一、注解的定义和作用 1、定义   注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&…

51的原理图和pcb的注意事项及出现的问题与解决办法

本次总结基于立创eda的注意事项总结&#xff0c;如有疑问&#xff0c;欢迎交流。 1.焊盘设成地网络&#xff01;&#xff01;&#xff01;&#xff01; 2.pcb的基本步骤是布局---布线---泪滴---铺铜---缝合孔&#xff0c;记得泪滴和缝合孔!! 3.元器件的封装要选择贴片的 这样…

认识阻塞队列

认识阻塞队列一、相关概念1.1 阻塞队列是什么1.2 生产者消费者模型二、标准库中的阻塞队列2.1 使用2.2 生产者消费者模型实现三、实现阻塞队列3.1 循环队列3.2 实现的细节3.3 代码一、相关概念 1.1 阻塞队列是什么 阻塞队列是一种特殊的队列&#xff0c;也遵守 “先进先出” …

CENTOS上的网络安全工具(十六)容器特色的Linux操作

这一篇&#xff0c;我们继续在Docker上折腾。之前我们已经展示了如何在容器上搭建安全产品的部署环境&#xff0c;这里我们需要更进一步&#xff0c;讨论如何在容器上搭建开发与调试环境。这是学习安全产品并且自己构建安全产品的基础步骤。 〇、精简系统上的操作技巧 使用Dock…

【LeetCode】直线上最多的点数 [H](几何)

149. 直线上最多的点数 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1&#xff1a; 输入&#xff1a;points [[1,1],[2,2],[3,3]] 输出&a…

【数据结构与算法分析】0基础带你学数据结构与算法分析11--AVL树

目录 二分查找 AVL 树 AVL 的平衡因子 AVL 的插入操作 单旋转 双旋转 对 AVL 树插入的总结 AVL 的移除操作 如果给定一个序列&#xff0c;你将如何在这个序列中查找一个给定元素 target&#xff0c;当找到时返回该元素的迭代器&#xff0c;否则返回末尾迭代器。首先排除…

python基于flask搭建http服务(二)—— 实现Excel上传、数据清洗、入库

一、技术点 利用flask 搭建简易的http服务,实现服务端文件上传;利用Blueprint将不同业务拆分至不同文件;利用bootstrap-fileinput组件构建页面;利用flask_cors配置允许跨域请求;利用sqlalchemy实现数据库连接;利用pandas实现Excel读取、清洗、入库;二、具体实现 2.1 目…

基于intel i3/i5/i7 视觉控制器 4个POE GigE

XM-5143 是针对机器视觉行业GigE相机应用场景的一款高性能工业计算机&#xff0c;可使用Intel 6/7代 65W 高性能CPU应对快速检测。4路独立Intel网络芯片&#xff0c;并支持POE供电&#xff0c;可减少布线。并配有快速隔离可编程DI/O芯片. XM-5143的规格产品类型机器视觉控制器防…

分布式事务都有哪些,到底有什么用,在项目当中该用哪个?

分布式的CAP理论应该是人尽皆知了&#xff0c;它描述了一致性&#xff08;C&#xff09;、可用性&#xff08;A&#xff09;、分区容错性&#xff08;P&#xff09;的一系列权衡。很多时候&#xff0c;我们要在一致性和可用性之间权衡&#xff0c;而分布式事务&#xff0c;就是…

20.EC实战 笔记本电脑的休眠唤醒是如何实现的

文章目录 1. EC什么时候(收到什么命令)之后来执行S0-->S3下电时序?2. S3(休眠)状态应该保留哪些电源?3. 控制笔记本进入休眠状态的三种方式总结:前言: 最近很多朋友在咨询休眠唤醒的问题,在笔记本中,休眠唤醒是一个基本功能,如果连休眠唤醒都没有,就失去了笔记本…

Volatile内存语义以及如何正确使用

目录 语义描述 重排序规则 JMM如何实现volatile语义 如何正确使用volatile变量 语义描述 写语义&#xff1a;当写一个volatile变量时候&#xff0c;JMM会把该线程对应的本地内存的共享变量直接刷新到主内存中。 读语义&#xff1a;当读一个volatile变量的时候。JMM会把该线…

分布式锁主动续期的入门级实现-自省 | 简约而不简单

一、背景 如果某个客户端获得锁之后处理时间超过最大约定时间&#xff0c;或者持锁期间内发生了故障导致无法主动释放锁&#xff0c;其持有的锁也能够被其他机制正确释放&#xff0c;并保证后续其它客户端也能加锁&#xff0c;整个处理流程继续正常执行。 简单解释一下&#xf…

LLeetCode题目笔记——6258. 数组中最长的方波

文章目录题目描述题目难度——中等方法一&#xff1a;一次遍历哈希代码Python暴力代码Python一次遍历总结题目描述 这是这周周赛的第二题&#xff0c;本来想是不是双指针的解法&#xff0c;但想半天没想出来咋用双指针&#xff0c;就想到了哈希。 给你一个整数数组 nums 。如果…