OJ题库:俩个有序序列(数组)合并

news2024/10/6 10:00:44

        前言:在部分大厂笔试时经常会使用OJ题目,这里对《有序序列合并》进行思路分析和讲解,在这里主要使用俩种方法进行讲解,希望对各位读者有所帮助。

        题目来自牛客网,欢迎各位积极挑战:有序序列合并_牛客题霸_牛客网


目录

题目相关信息:

描述

输入描述

输出描述

 示例

方法一(最优解):

设计思路

实现细节

初始化 

比较逻辑

完整代码实现

方法二(暴力排序):


题目相关信息:

描述

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

数据范围1 ≤ n, m ≤ 1000, 序列中的值满足 0 ≤ val ≤ 30000 

输入描述

输入包含三行:

  • 第一行包含两个正整数 n, m,用空格分隔。n 表示第二行第一个升序序列中数字的个数,m 表示第三行第二个升序序列中数字的个数
  • 第二行包含n个整数,用空格分隔
  • 第三行包含m个整数,用空格分隔

输出描述

        输出为一行,输出长度为 n+m 的升序序列,即长度为 n 的升序序列和长度为 m 的升序序列中的元素重新进行升序序列排列合并

 示例

输入:   5   6
           1   3   7    9    22
           2   8   10  17  33  44

输出:   1   2   3    7    8    9    10    17    22    33    44


方法一(最优解):

设计思路

首先,确定使用数组的方式存储俩个数列,如下图所示

        然后使用俩个指针分别来维护他们,每一次比较俩个指针指向的数据的大小,然后将较小的数据放在一个新的数组中,并且让指针指向下一个数据,这样反复移动指针后,我们就可以拿到从小到大的有序数据

 

实现细节

初始化 

        首先题目要求输入的数组的大小 nm 大于 0 小于 1000,那我们就使用俩个大小为 1000 的数组来保存我们输入的数组,分别为 arr1 arr2 ,在创建一个大小为 1000 的数组 arr3 来用于输出展示,也就是记录合并后的数组

    int n = 0;
    int m = 0;

    int arr1[1000] = { 0 };
    int arr2[1000] = { 0 };
    int arr3[1000] = { 0 };

    //printf("请分别输入俩个数组的大小\n");
    scanf("%d %d", &n, &m);

    //输入2组数据
    ///printf("请输入数组 1 的内容:\n");
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    //printf("请输入数组 2 的内容:\n");
    for (int i = 0; i < m; i++)
    {
        scanf("%d", &arr2[i]);
    }

比较逻辑

        我们使用指针 i 来维护 arr1 数组,使用指针 j 来维护 arr2 数组,使用指针 k 来维护 arr3 数组,让 i j 都指向数组首元素,然后再确定俩边俩个数组都还有元素的时候,对他们指向的元素进行对比,哪边的数字小,就先将整个数字赋给 arr3 数组,然后指针后移,再进行比较

    int i = 0;//维护 arr1
    int j = 0;//维护 arr2
    int k = 0;//维护 arr3

    while ((i < n) && (j < m))
    {
        if (arr1[i] < arr2[j])
        {
            //printf("%d ", arr1[i++]);
            arr3[k++] = arr1[i++];
        }
        else
        {
            //printf("%d ", arr2[j++]);
            arr3[k++] = arr2[j++];
        }
    }

        因为俩个数组不一定是等长的,所以当其中一个数组遍历完成后,我们要进行判断,将多余的数字之间添加在 arr3 的末尾,在这里因为我们的输入必须是有序的,所以可以直接添加,添加后的结果也一定是有序的

    //当其中一个数组的元素排序完成后将另一个数组的剩余元素全部加在 arr3 末尾 
    if (i == n)
    {
        while (j < m)
        {
            //printf("%d ", arr2[j++]);
            arr3[k++] = arr2[j++];
        }
    }
    else
    {
        while (i < n)
        {
            //printf("%d ", arr1[i++]);
            arr3[k++] = arr1[i++];
        }
    }

完整代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
    int n = 0;
    int m = 0;

    int arr1[1000] = { 0 };
    int arr2[1000] = { 0 };
    int arr3[1000] = { 0 };

    //printf("请分别输入俩个数组的大小\n");
    scanf("%d %d", &n, &m);

    //输入2组数据
    ///printf("请输入数组 1 的内容:\n");
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    //printf("请输入数组 2 的内容:\n");
    for (int i = 0; i < m; i++)
    {
        scanf("%d", &arr2[i]);
    }
 
    int i = 0;//维护 arr1
    int j = 0;//维护 arr2
    int k = 0;//维护 arr3

    while ((i < n) && (j < m))
    {
        if (arr1[i] < arr2[j])
        {
            //printf("%d ", arr1[i++]);
            arr3[k++] = arr1[i++];
        }
        else
        {
            //printf("%d ", arr2[j++]);
            arr3[k++] = arr2[j++];
        }
    }
    //当其中一个数组的元素排序完成后将另一个数组的剩余元素全部加在 arr3 末尾 
    if (i == n)
    {
        while (j < m)
        {
            //printf("%d ", arr2[j++]);
            arr3[k++] = arr2[j++];
        }
    }
    else
    {
        while (i < n)
        {
            //printf("%d ", arr1[i++]);
            arr3[k++] = arr1[i++];
        }
    }
    for (int i = 0; i < (n + m); i++)
    {
        printf("%d ", arr3[i]);
    }

    return 0;
}

方法二(暴力排序):

        这种方法效率非常的低,笔者个人建议不要使用这种方法,因为部分 OJ 题目可能会对时间复杂度或者空间复杂度进行要求,将俩个数组放在第三个数组中,然后使用冒泡排序,选择排序等等排序方法从小到大排序的方法很容易想到,在这里只需要注意使用排序的方法就可以了,这里笔者使用冒泡排序进行举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
    int n = 0;
    int m = 0;

    int arr1[1000] = { 0 };
    int arr2[1000] = { 0 };
    int arr3[1000] = { 0 };

    printf("请分别输入俩个数组的大小\n");
    scanf("%d %d", &n, &m);

    //输入2组数据
    printf("请输入数组 1 的内容:\n");
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    printf("请输入数组 2 的内容:\n");
    for (int i = 0; i < m; i++)
    {
        scanf("%d", &arr2[i]);
    }

    int i = 0;//维护 arr1
    int j = 0;//维护 arr2
    int k = 0;//维护 arr3
    //全部放入arr3
    while (i < n)
    {
        arr3[k++] = arr1[i++];
    }
    
    while (j < m)
    {
        arr3[k++] = arr2[j++];
    }
    //排序
    for (int i = 0; i < (n + m - 1); i++)
    {
        for (int k = 0; k < (n + m - i - 1); k++)
        {
            if(arr3[k] >= arr3[k+1])
            {
                int temp = 0;
                temp = arr3[k];
                arr3[k] = arr3[k + 1];
                arr3[k + 1] = temp;
            }
        }
    }
    //打印arr3
    for (int i = 0; i < (n + m); i++)
    {
        printf("%d ", arr3[i]);
    }

    return 0;
}

        综上,俩个方法对于时间空间的利用效率并不相同,但都能完成我们的期望目标,但是值得注意的是,第二种方法并不能保证在部分对时间空间复杂度有要求的 OJ 题目成功运行,本次分享就到此结束了,希望我的分享对您有所帮助

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

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

相关文章

汽车电子笔记之:基于AUTOSAR的多核监控机制

目录 1、概述 2、系统监控的目标 2.1、任务的状态机 2.2、任务服务函数 2.3、任务周期性事件 2.4、时间监控的指标 2.5、时间监控的原理 2.6、CPU负载率监控原理 2.6.1、设计思路 2.6.2、监控方法的评价 3、基于WDGM模块热舞时序监控方法 3.1、活跃监督 3.2、截至时…

Mongodb启动失败相关问题解决最全

一、mongod突然启动失败&#xff0c;存在mongod.lock文件 查找文件 find / -name mongod.lock -d删除该文件 rm -rf mongod.lock重新启动 /data/mongodb/bin/mongod --config /data/mongodb/bin/mongodb.conf --replSet cloud通过修改的方式启动 /data/mongodb/bin/mongod --r…

与信创国产化高度适配的低代码开发框架

信创产业是中国经济发展的基础&#xff0c;也是重要驱动力。坚持基础软件自主创新&#xff0c;是国产软件正版化应用和推广的源头。行业预测&#xff0c;2023年信创产业市场规模预计为18710.59亿元&#xff0c;预计到2025年将会接近3.5万亿元。 信创产业的主要目标是实现信息技…

屏蔽百度右侧热搜和首页新闻

先看效果 这样就没有垃圾新闻影响我们的注意力了 设置其实很简单&#xff0c;首先需要安装一下 Adblock Plus&#xff0c;安装的方式很多&#xff0c;这里我使用一个网站直接添加即可&#xff1a; Download Adblock Plus 3.18.1 CRX File for Chrome - Crx4Chrome 然后就能在…

Django(8)-静态资源引用CSS和图片

除了服务端生成的 HTML 以外&#xff0c;网络应用通常需要一些额外的文件——比如图片&#xff0c;脚本和样式表——来帮助渲染网络页面。在 Django 中&#xff0c;我们把这些文件统称为“静态文件”。 我们使用static文件来存放静态资源&#xff0c;django会在每个 INSTALLED…

【已解决】pycharm突然双击无法打开,重启电脑也不管用

1.问题&#xff1a; pycharm突然双击无法打开&#xff0c;重启电脑也不管用 2.解决 2.1 方法一&#xff08;修改Roaming&#xff09; 1.找到C盘对应路径下的pycharm版本 2. 用记事本打开文件类型为VMOPTIONS文件 3. 修改或删除最后一行的映射路径 4.保存退出 2.2 方法二…

无涯教程-Python机器学习 - Analysis of Silhouette Score函数

剪影得分的范围是[-1,1]。其分析如下- 1分数-接近1 剪影分数表示样本距离其邻近簇很远。 0分数-0 剪影分数表示样本在将两个相邻聚类分隔开的决策边界上或非常接近。 -1分数-1 剪影分数表示样本已分配给错误的聚类。 Silhouette得分的计算可以使用以下公式完成 $$剪影得…

FAB厂逃离指南—转行IC之经验分享!

一、为什么转行&#xff1f; 毕业后&#xff0c;我在成都一家国企做面板半导体工艺&#xff0c;说是工艺但是去了得先学习了解进口的设备半年左右&#xff0c;还得上夜班。&#xff08;这里给各位一个小小的建议&#xff1a;如果毕业找FAB厂类工作要慎重&#xff0c;非纯研发岗…

《机器学习在车险定价中的应用》实验报告

目录 一、实验题目 机器学习在车险定价中的应用 二、实验设置 1. 操作系统&#xff1a; 2. IDE&#xff1a; 3. python&#xff1a; 4. 库&#xff1a; 三、实验内容 实验前的猜想&#xff1a; 四、实验结果 1. 数据预处理及数据划分 独热编码处理结果&#xff08;以…

【QT】ComboBox的使用(14)

ComboBox这个控件我常用于多文本的储存、调用&#xff0c;正如他的中文意思为&#xff1a;下拉列表框。 下拉列表框&#xff1a;字面意思就是一个多文本的列表框&#xff0c;今天来看下如何使用ComboBox这个控件。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装&…

恒运资本:“鹰派”讲话吓坏市场?美股大跳水后反弹!

鲍威尔表示&#xff0c;“如果适宜&#xff0c;美联储准备继续加息”。 北京时间8月25日晚间&#xff0c;美联储主席鲍威尔在杰克逊霍尔全球央行年会上发表讲话。 鲍威尔在讲话过程中&#xff0c;警告通胀“依旧过高”&#xff0c;以及“如果适宜&#xff0c;美联储准备继续加…

会话跟踪技术 【CookieSession】

会话技术 1 会话跟踪技术的概述2 Cookie2.1 Cookie的基本使用2.1.1 概念2.1.2 Cookie的工作流程2.1.3 Cookie的基本使用2.1.3.1 发送Cookie2.1.3.2 获取Cookie 2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文 3 Session3.1 Session的基本…

多线程学习之生产者和消费者与阻塞队列的关系

生产者和消费者 概述&#xff1a; 生产者消费者问题&#xff0c;实际上主要是包含了两类线程&#xff1a; 生产者线程用于生产数据消费者线程用于消费数据 生产者和消费者之间通常会采用一个共享的数据区域&#xff0c;这样就可以将生产者和消费者进行解耦&#xff0c; 两…

1.MIMO信号检测

目录 最优信号检测算法 次最优信号检测算法 分层信号检测算法 线性信号检测算法 迫零线性信号检测算法 最小均方误差线性信号检测算法 非线性信号检测算法 在MIMO-OFDM系统中&#xff0c;信号检测算法可以通过将MIMO系统的信号检测算法应用于各个并行的子信道进行信号…

java八股文面试[JVM]——类初始化过程

回顾类加载过程&#xff1a; 知识来源&#xff1a; 【2023年面试】Class初始化过程是什么_哔哩哔哩_bilibili

哪种类型耳机不伤耳朵,对耳朵伤害最小的耳机类型

在骨传导耳机的普及浪潮下&#xff0c;人们越来越意识到长期使用传统耳机对耳道造成的伤害。许多朋友纷纷转向相对更加护听的骨传导耳机&#xff0c;但仍有一部分人对这项技术不太了解&#xff0c;甚至被误导认为骨传导耳机会对听力和大脑造成伤害。因此&#xff0c;我将给大家…

【应用层】网络基础 -- HTTPS协议

HTTPS 协议原理加密为什么要加密常见的加密方式对称加密非对称加密 数据摘要&&数据指纹 HTTPS 的工作过程探究方案1-只使用对称加密方案2-只使用非对称加密方案3-双方都使用非对称加密方案4-非对称加密对称加密中间人攻击-针对上面的场景 CA认证理解数据签名方案5-非对…

Redis限流实践:实现用户消息推送每天最多通知2次的功能

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

log4net 输出中文乱码

如上图 在appender属性内加入 <param name"Encoding" value"utf-8" /> 问题解决!

区块链金融项目怎么做?

区块链技术的兴起引发了金融领域的变革&#xff0c;为金融行业带来了前所未有的机遇与挑战。在这个快速发展的领域中&#xff0c;如何在区块链金融领域做出卓越的表现&#xff1f;本文将从专业性和思考深度两个方面&#xff0c;探讨区块链金融的发展路径&#xff0c;并为读者提…