【NOI-题解】1009 - 数组逆序1162 - 数组元素的删除1211 - 数组元素的插入1161. 元素插入有序数组1159. 数组元素的移动

news2024/11/14 12:22:07

文章目录

  • 一、前言
  • 二、问题
    • 问题:1009 - 数组逆序
    • 问题:1162 - 数组元素的删除
    • 问题:1211 - 数组元素的插入
    • 问题:1161. 元素插入有序数组
    • 问题:1159. 数组元素的移动
  • 三、感谢

一、前言

本章节主要对数组问题中数组元素移动的题目进行讲解,包括《1009 - 数组逆序》《1162 - 数组元素的删除》《1211 - 数组元素的插入》《1161. 元素插入有序数组》《1159. 数组元素的移动》。

二、问题

问题:1009 - 数组逆序

类型:数组元素移动


题目描述:

给你 m 个整数,将其逆序输出。

输入:

第一行一个整数 m (3≤m≤100)代表数的个数。

第二行 m 个整数(空格隔开)(这些数在 0∼10^6之间)。

输出:

m 个整数(空格隔开)。

样例:

输入:

3
1 7 5

输出:

5 7 1

在这里插入图片描述


1.分析问题

  1. 已知:用户将输入m个整数。
  2. 未知:需要逆序输出这些整数。
  3. 关系:通过交换数组元素的位置实现逆序。

2.定义变量

  • 用于存储数组的长度,即用户将输入的整数的数量。
  • 定义一个最大长度为100的数组,用于存储用户输入的整数。
    // 二、数据定义
    int n; 
    int a[100]; 

3.输入数据

  • 输入数组的长度。
  • 逐个输入整数,并存储在数组中。
 // 三、数据输入
    cin >> n; 
    for(int i = 0; i < n; i++){
        cin >> a[i]; 
    }

4.数据计算

  • 使用一个循环遍历数组的前半部分,通过交换数组两端的元素来实现逆序。
  	// 四、数据计算 - 实现逆序
    int temp; 
    for(int i = 0; i < n / 2; i++){ 
        temp = a[i];
        a[i] = a[n - i - 1]; 
        a[n - i - 1] = temp; 
    }

5.输出结果

  • 逐个输出逆序后的数组元素。
  // 五、输出结果
    for(int i = 0; i < n; i++){
        cout << a[i] << " "; 
    }

完整代码如下:

#include<iostream>
using namespace std;
int main(){
    // 一、分析问题
    // 已知:用户将输入m个整数
    // 未知:需要逆序输出这些整数
    // 关系:通过交换数组元素的位置实现逆序
    
    // 二、数据定义
    int n; // 用于存储数组的长度,即用户将输入的整数的数量
    int a[100]; // 定义一个最大长度为100的数组,用于存储用户输入的整数
    
    // 三、数据输入
    cin >> n; // 输入数组的长度
    for(int i = 0; i < n; i++){
        cin >> a[i]; // 逐个输入整数,并存储在数组中
    }
    
    // 四、数据计算 - 实现逆序
    int temp; // 用于临时存储数组元素,以便交换
    for(int i = 0; i < n / 2; i++){ // 只需遍历数组前半部分
        temp = a[i]; // 将当前元素存储在temp中
        a[i] = a[n - i - 1]; // 将对应位置的后半部分元素放到前半部分
        a[n - i - 1] = temp; // 将temp中的元素放到后半部分
    }
    
    // 五、输出结果
    for(int i = 0; i < n; i++){
        cout << a[i] << " "; // 逐个输出逆序后的数组元素
    }
    
    return 0; // 主函数正常结束
}

问题:1162 - 数组元素的删除

类型:数组元素移动


题目描述:

把一个数组的第 x 个位置的元素删除掉。

输入:

输出有三行:

第一行有一个整数 n ( n≤10 );

第二行有 n 个整数(每个整数在1~1000之间);

第三行有一个整数 x(1≤x≤n),为要删除的位置。

输出:

输出更新后的数组。

样例:

输入:

5
1 2 3 4 5 
3

输出:

1 2 4 5

在这里插入图片描述


1.分析问题

  1. 已知:用户将输入一个数组和一个要删除的元素的位置。
  2. 未知:删除指定位置的元素后的新数组。
  3. 关系:将指定位置之后的所有元素向前覆盖移动一位。

2.定义变量

  • n:数组的长度。
  • x::要删除的元素的位置。
    // 二、数据定义
    int n; 
    int a[100]; 
    int x; 

3.输入数据

  • 输入数组的长度。
  • 逐个输入数组元素 。
  • 输入要删除的元素的位置。
  // 三、数据输入
    cin >> n; 
    for(int i = 0; i < n; i++){
        cin >> a[i]; 
    }
    cin >> x; 

4.数据计算

  • C++数组的下标从0开始,所以将输入的位置减1。
  • 将指定位置之后的元素向前覆盖移动一位。
    // 四、数据计算 - 删除指定位置的元素
    --x; 
    for(int i = x; i < n - 1; i++){
        a[i] = a[i + 1]; 
    }

5.输出结果

  • 逐个输出数组元素。
    // 五、输出结果 - 输出删除元素后的数组
    for(int i = 0; i < n - 1; i++){
        cout << a[i] << " "; 
    }

完整代码如下:

#include<iostream>
using namespace std;

int main(){
    // 一、分析问题
    // 已知:用户将输入一个数组和一个要删除的元素的位置。
    // 未知:删除指定位置的元素后的新数组。
    // 关系:将指定位置之后的所有元素向前覆盖移动一位。

    // 二、数据定义
    int n; // 数组的长度
    int a[100]; // 数组,最大长度为100
    int x; // 要删除的元素的位置

    // 三、数据输入
    cin >> n; // 输入数组的长度
    for(int i = 0; i < n; i++){
        cin >> a[i]; // 逐个输入数组元素
    }
    cin >> x; // 输入要删除的元素的位置

    // 四、数据计算 - 删除指定位置的元素
    --x; // C++数组的下标从0开始,所以将输入的位置减1
    for(int i = x; i < n - 1; i++){
        a[i] = a[i + 1]; // 将指定位置之后的元素向前覆盖移动一位
    }

    // 五、输出结果 - 输出删除元素后的数组
    for(int i = 0; i < n - 1; i++){
        cout << a[i] << " "; // 逐个输出数组元素
    }

    return 0; // 主函数正常结束
}

问题:1211 - 数组元素的插入

类型:数组元素移动


题目描述:

在一个数组的第 x 个位置插入一个新的数y。

输入:

有四行 第一行有一个整数 n (5≤n≤10);

第二行有 n 个整数,用空格隔开;

第三行有一个整数 x,为要插入的位置;

第四行有一个整数 y,为要插入的整数。

输出:

更新后的数组。

样例:

输入:

5
7 2 3 4 5
2
9

输出:

7 9 2 3 4 5

在这里插入图片描述


1.分析问题

  1. 已知:一个数组。
  2. 未知:更新后的数组。
  3. 关系:在 x 个位置插入一个新的数 y。

2.定义变量

  • n 是数组的原始长度。
  • a[100] 是用于存储数组元素的数组,最大长度为100。
  • x 是要插入新元素的位置。
  • y 是要插入的新元素。
	//二、数据定义 
	int n,a[100],x,y;

3.输入数据

  • 首先读取数组的长度n。
  • 接着读取n个数组元素并存储在a中。
  • 然后读取插入位置x和新值y。
	//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>x;
	cin>>y;

4.数据计算

  • 将插入位置x减1,因为数组下标是从0开始的。
  • 从数组的末尾开始,将每个元素向后移动一位,直到到达位置x。
  • 在位置x处放置新值y。
	//四、数据计算 
	--x;
	for(int i=n;i>=x;i--){
		a[i]=a[i-1];
	}
	a[x]=y;

5.输出结果

  • 打印出更新后的数组,包括新插入的元素。
	//五、输出结果 
	for(int i=0;i<n+1;i++){
		cout<<a[i]<<" ";
	}

完整代码如下:

#include<iostream> // 引入标准输入输出流库
using namespace std; // 使用std命名空间,避免每次调用输入输出函数时都加上std::

int main(){
    // 一、分析问题
    // 已知:一个数组
    // 未知:更新后的数组
    // 关系:在 x 个位置插入一个新的数 y

    // 二、数据定义
    int n, a[100]; // 定义一个整型变量n和一个最多有100个元素的整型数组a
    int x, y;      // 定义插入的位置x和新元素y

    // 三、数据输入
    cin >> n;      // 输入数组的长度
    for(int i = 0; i < n; i++){ // 循环读取数组的元素
        cin >> a[i];            // 读取第i个元素并存入数组a
    }
    cin >> x;                   // 输入插入的位置
    cin >> y;                   // 输入要插入的元素

    // 四、数据计算
    --x;                        // 由于数组索引从0开始,所以插入位置需要减1
    for(int i = n; i >= x; i--){ // 从数组的末尾开始,将所有元素向后移动一位
        a[i] = a[i-1];          // 将第i-1个元素复制到第i个位置
    }
    a[x] = y;                   // 在位置x处插入新元素y

    // 五、输出结果
    for(int i = 0; i <= n; i++){ // 注意这里使用<=n,因为数组现在多了一个元素
        cout << a[i] << " ";    // 输出数组中的每一个元素
    }
    return 0;                   // 主函数结束,返回0表示程序正常结束
}

问题:1161. 元素插入有序数组

类型:数组元素移动


题目描述:

给你一个整数 n 和一个数列(数列个数不超过 1000 ),这个数列保证从小到大排列,现要求将这个整数 n 插入到数列中,使新的数列仍然从小到大排列。

输入:

第一行一个整数 n 表示等待插入的数 ;

第二行一个整数 m 表示数列中数的个数;

第三行 m 个整数(空格隔开)。

输出:

一行整数:新的数列(空格隔开)。

样例:

输入:

2
4
1 3 4 5

输出:

1 2 3 4 5

在这里插入图片描述


1.分析问题

  1. 已知:一个整数 n 和一个m大小有序数列。
  2. 未知:新的数列(在原数列中插入n后)。
  3. 关系: 整数 n 插入到数列,数列仍然从小到大排列。

2.定义变量

  • n:待插入的整数。
  • m:数组的原始长度。
  • a[1010]:一个大小为1010的数组,用来存储原始的数组元素和即将插入的整数。
  • idx:插入点的索引,初始化为0。
    int n, m, a[1010], idx = 0;

3.输入数据

  • 读取待插入的整数n和数组的原始长度m。
    cin >> n;
    cin >> m;
  • 首先读取数组的元素,然后检查每个元素是否小于n。如果是,则更新idx为当前元素的下一个位置的索引,这样idx最终将指向第一个大于或等于n的元素的位置,或者在所有元素都小于n的情况下,指向数组的末尾。
    for(int i = 0; i < m; i++){
        cin >> a[i];
        if(a[i] < n){
            idx = i + 1;
        }
    }

4.数据计算

  • 将数组中从idx开始的所有元素向后移动一个位置,为插入n腾出空间。然后在idx位置插入n。
    for(int i = m; i > idx; i--){
        a[i] = a[i-1];
    }
    a[idx] = n;

5.输出结果

  • 输出更新后的数组,包括新插入的元素n。
    for(int i = 0; i <= m; i++){
        cout << a[i] << " ";
    }

完整代码如下:

#include<bits/stdc++.h> // 引入C++标准库中的所有头文件
using namespace std; // 使用标准命名空间

int main(){
    // 一、分析问题
    // 已知:一个整数 n 和一个m大小有序数列。
    // 未知:新的数列(在原数列中插入n后)。
    // 关系: 整数 n 插入到数列,数列仍然从小到大排列。

    // 二、定义变量(已知、未知、关系)
    int n, m, a[1010]; // 定义整数n,数列长度m,和最多可包含1010个元素的数组a
    int idx = 0;       // 定义idx作为插入点的索引

    // 三、输入已知
    cin >> n;          // 输入要插入的整数n
    cin >> m;          // 输入数列的长度m
    for(int i = 0; i < m; i++){
        cin >> a[i];   // 输入数列的每个元素
        if(a[i] < n){  // 检查当前元素是否小于n
            idx = i + 1; // 如果是,更新插入点的索引
        }
    }

    // 四、根据关系计算
    for(int i = m; i > idx; i--){ // 从数列的末尾开始,将所有元素向后移动一位,直到idx
        a[i] = a[i-1];            // 将第i-1个元素复制到第i个位置
    }
    a[idx] = n;                  // 在找到的插入点idx处插入n

    // 五、输出未知
    for(int i = 0; i <= m; i++){ // 输出更新后的数列
        cout << a[i] << " ";     // 注意:这里i <= m是因为数组大小增加了1
    }

    return 0;                    // 正常退出程序
}

问题:1159. 数组元素的移动

类型:数组元素移动


题目描述:

数组元素的移动,把数组的第 x 个位置的元素先保存起来,然后把 x+1 到 n 的元素,依次往前移一位,最后原来的第 x 个位置的元素放在最后。

输入:

有 3 行

第一行有一个整数 n (n≤10 );

第二行有 n 个整数;

第三行有一个整数 x 。

输出:

移动后的数组。

样例:

输入:

8
1 2 3 4 5 6 7 8
1

输出:

2 3 4 5 6 7 8 1

在这里插入图片描述


1.分析问题

  1. 已知:一个n大小的数组,x坐标。
  2. 未知:移动后的数组。
  3. 关系: 把数组的第 x 个位置的元素先保存起来,然后把 x+1 到 n 的元素,依次往前移一位,最后原来的第 x 个位置的元素放在最后。

2.定义变量

  • n:数组的长度。
  • a[20]:数组,用于存储n个整数。
  • x:需要移动的元素的索引位置。
	//二、定义变量(已知、未知、关系) 
	int n,a[20],x;

3.输入数据

  • 首先读取数组的长度n。
  • 然后读取n个数组元素。
  • 最后读取要移动的元素的索引x。
	//三、输入已知
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>x;

4.数据计算

  • 将x减1,因为数组索引是从0开始的。
  • 保存第x个位置的元素到临时变量t中。
  • 从x开始,将x+1到n-1的每个元素向前移动一位,覆盖原来的位置。
  • 将原先的第x个元素(保存在t中)放到数组的末尾。
	//四、根据关系计算
	--x;
	int t=a[x];
	for(int i=x;i<n-1;i++){
		a[i]=a[i+1];
	}
	a[n-1]=t;

5.输出结果

  • 打印更新后的数组。
	//五、输出未知 
	for(int i=0;i<n;i++){
		cout<<a[i]<<" ";
	}

完整代码如下:

#include<bits/stdc++.h> // 包含C++标准库中的所有头文件
using namespace std; // 使用std命名空间中的所有元素

int main(){
    // 一、分析问题
    // 已知:一个大小为n的数组和一个坐标x。
    // 未知:移动元素后的数组。
    // 关系:将数组的第x个位置的元素移到数组的末尾,同时保持其他元素的相对顺序不变。

    // 二、定义变量
    int n; // 数组的长度
    int a[20]; // 数组,最多可容纳20个整数
    int x; // 需要移动的元素的索引位置

    // 三、输入已知数据
    cin >> n; // 输入数组的长度
    for(int i = 0; i < n; i++){
        cin >> a[i]; // 输入数组的每个元素
    }
    cin >> x; // 输入要移动的元素的索引位置

    // 四、根据关系计算
    --x; // 调整x为基于0的索引
    int t = a[x]; // 保存要移动的元素
    for(int i = x; i < n - 1; i++){ // 移动元素
        a[i] = a[i + 1]; // 将后面的元素移动到当前位置
    }
    a[n - 1] = t; // 将原先的元素放到数组的末尾

    // 五、输出未知数据
    for(int i = 0; i < n; i++){
        cout << a[i] << " "; // 输出更新后的数组
    }

    return 0; // 返回0,表示程序正常结束
}

三、感谢

如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。

每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!

在这里插入图片描述

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

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

相关文章

昇思25天学习打卡营第23天 | 基于MindSpore的红酒分类实验

学习心得&#xff1a;基于MindSpore的红酒分类实验 在机器学习的学习路径中&#xff0c;理解和实践经典算法是非常重要的一步。最近我进行了一个有趣的实验&#xff0c;使用MindSpore框架实现了K近邻&#xff08;KNN&#xff09;算法进行红酒分类。这个实验不仅加深了我对KNN算…

Jenkins+Gitlab持续集成综合实战

一、持续集成应用背景&#xff1a; DevOps&#xff1a;&#xff08;英文Development&#xff08;开发&#xff09;和Operations&#xff08;技术运营&#xff09;的组合&#xff09;是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#…

设计模式|观察者模式

观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时&#xff0c;它的所有观察者都会收到通知并更新。观察者模式常用于实现事件处理系统、发布-订阅模式等。在项目中&#xff0c…

C语言 | Leetcode C语言题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; // 判断是否为完全平方数 bool isPerfectSquare(int x) {int y sqrt(x);return y * y x; }// 判断是否能表示为 4^k*(8m7) bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7; }int numSquares(int n) {if (isPerfect…

CSA笔记5-局域网yum源配置互联网yum源配置源代码编译安装

局域网yum源配置&#xff1a;建设一个本地网络仓库给本地局域网用户提供下载安装 互联网yum源配置&#xff1a;在线获取最新安装文件的通道 1.局域网web方式yum源配置&#xff1a; 服务器提供yum安装服务&#xff1a; yum install -y httpd 安装并启动httpd 在本地源的基…

Spring AOP(2)原理(代理模式和源码解析)

目录 一、代理模式 二、静态代理 三、动态代理 1、JDK动态代理 &#xff08;1&#xff09;JDK动态代理实现步骤 &#xff08;2&#xff09;定义JDK动态代理类 &#xff08;3&#xff09;代码简单讲解 2、CGLIB动态代理 &#xff08;1&#xff09;CGLIB 动态代理类实现…

RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…

Java学习Day14:基础篇4

数组 1.理解数组 数组也是一种类型&#xff0c;引用类型&#xff01; 2.数组的定义 3.数组的初始化 静态&#xff1a; 动态&#xff1a; 不同数据类型数组初始化值&#xff1a; null不可用.equal方法&#xff0c;会报错&#xff01; 4.使用数组 5.foreach循环 6.深入数组 7&am…

绘制拟合联合密度分布

绘制拟合联合密度分布 import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import KernelDensity# 生成模拟数据 np.random.seed(42) mean [0, 0] cov [[1, 0.5], [0.5, 1]] data np.random.multivariate_normal(mean, cov, size200) a data[:, 0…

基于jeecgboot-vue3的Flowable流程-自定义业务表单流程历史信息显示

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、对于自定义业务表单的流程历史记录信息做了调整&#xff0c;增加显示自定义业务表单 <el-tab-pane label"表单信息" name"form"><div v-if"customF…

德国云手机:企业移动办公解决方案

在现代商业环境中&#xff0c;移动办公已经成为一种趋势。德国云手机作为一种高效的解决方案&#xff0c;为企业提供了强大的支持。本文将探讨德国云手机如何优化企业的移动办公环境。 一、德国云手机的主要优势 高灵活性 德国云手机具有高度的灵活性&#xff0c;能够根据用户需…

鸿蒙HarmonyOS开发:用户通知服务Noification的详细使用指南

文章目录 一、Notification Kit简介二、能力范围三、业务流程四、通知样式&#xff1a;五、约束限制六、开发步骤6.1、导入模块。6.2、构造NotificationRequest对象&#xff0c;并发布通知。6.2.1、普通文本类型。6.2.2、长文本类型。6.2.3、多行文本类型。 6.3、为通知添加行为…

SpringBoot源码(1)ApplicationContext和BeanFactory

1、调用getBean方法 SpringBootApplication public class SpringBootDemoApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext SpringApplication.run(SpringBootDemoApplication.class, args);applicationContext.get…

javaFx 系统最小化托盘(及其避坑)、开机自启动

1、系统最小化托盘 参考资料&#xff1a; https://blog.51cto.com/u_14191/6310480 javafx 设置最小窗口大小 - Java (1) - 芒果文档 注意事项 1.直接使用第一个参考资料中的MinWindow类即可。 #最小化托盘 -- 一般放置在 start(Stage stage)处 MinWindow.getInstance().…

鸿蒙仓颉语言【cryptocj 库】(介绍与SHA、MD5、HMAC摘要算法)

cryptocj 库 介绍 cryptocj 是一个安全的密码库&#xff0c;包括常用的密码算法、常用的密钥生成和签名验证。 该库是对 C 语言的 openSSL 封装的仓颉加密算法 1 提供SHA、MD5、HMAC摘要算法。 前置条件&#xff1a;NA 场景&#xff1a; OHOS&#xff0c; Linux&#xff…

昇思25天学习打卡营第17天 | CycleGAN图像风格迁移互换

通过深入学习CycleGAN模型&#xff0c;我对无监督图像到图像的转换技术有了更深的理解。CycleGAN不仅能在没有成对训练样本的情况下实现域之间的转换&#xff0c;而且在保持内容结构的同时成功转换图像风格&#xff0c;这在许多应用中都非常有用&#xff0c;如艺术风格转换、季…

C++树(二)【直径,中心】

目录&#xff1a; 树的直径&#xff1a; 树的直径的性质&#xff1a; 性质1&#xff1a;直径的端点一定是叶子节点 性质2&#xff1a;任意点的最长链端点一定是直径端点。 性质3&#xff1a;如果一棵树有多条直径,那么它们必然相交&#xff0c;且有极长连…

Linux搭建Kubernetes集群(单Master)【附图文】

文章目录 一、集群环境配置要求二、主机准备三、初始环境准备1.关闭防火墙2.关闭 selinux3.关闭swap4.加载 br_netfilter 模块5.允许iptables转发流量6.设置时间同步 四、安装Docker五、安装kubeadm, kubectl, kubelet六、在Master节点部署集群七、将 node 节点加入集群八、部署…

springcloud rocketmq 新增的消费者组从哪里开始消费

如果新建一个新的消费者组&#xff0c;是否会消费历史消息&#xff0c;导致重复消费&#xff1f; 直接在 console 界面新增消费者组&#xff0c;但是没有办法绑定订阅关系&#xff0c;没有找到入口&#xff0c;在 控制台项目源码 rocketmq-externals 也没有找到可以确定订阅关系…

Windows 11预览补丁KB5040527影响火绒驱动加载的解决办法

7 月 11 日&#xff0c;微软更新Windows 11 预览版本补丁 KB5040527&#xff0c;补丁安装后会影响火绒驱动加载导致火绒安全软件服务异常&#xff0c;补丁相关信息如下&#xff1a; https://blogs.windows.com/windows-insider/2024/07/11/releasing-windows-11-builds-22621-…