【C++】c++入门之数组基础二

发布时间:2024年01月16日


前言

本章节主要讲述数组的一些基本操作,所有类型都将以题目进行讲解。

学习路线:C++从入门到NOI学习路线

学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲

上一站:c++入门之数组基础一

下一站:


一、数组元素的移动

问题一:1009 - 数组逆序

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

在这里插入图片描述
解法一: 不对数组进行改动,直接将数组倒序输出也能满足题目的要求。

1.分析问题

  1. 已知:m个整数
  2. 未知:逆序输出
  3. 关系:下标做减法

2.定义变量

根据分析的已知,未知按需要定义变量。

	//二、数据定义 
	int m,a[100];

3.输入数据

遍历输入。

	//三、数据输入 
	cin>>m;
	for(int i=0;i<m;i++){
		cin>>a[i];
	}

4.数据计算

数组下标是从0开始,到m-1结束。因此倒序输出要反过来,将i做减法。

	//四、数据计算 
	for(int i=m-1;i>=0;i--){
		//五、输出结果
		cout<<a[i]<<" ";
	}

5.输出结果

#include<iostream>
using namespace std;
int main(){
	//一、分析问题
	//已知:m个整数
	//未知:逆序输出
	//关系:下标做减法 

	
	//二、数据定义 
	int m,a[100];
	

	//三、数据输入 
	cin>>m;
	for(int i=0;i<m;i++){
		cin>>a[i];
	}
	//四、数据计算 
	for(int i=m-1;i>=0;i--){
		//五、输出结果
		cout<<a[i]<<" ";
	}

	 
	return 0;	
}

解法二:将整个数组进行逆序,做法就是将0位置上和m-1位置上的元素交换,然后将1位置上和m-2位置上的元素交换…重复m/2次即可。不能懂为什么交换m/2次,可以在一张纸上画出数组,在进行对折观察。

1.分析问题

  1. 已知:m个整数
  2. 未知:逆序输出
  3. 关系:数组对称交换

2.定义变量

根据分析的已知,未知按需要定义变量。

	//二、数据定义 
	int n,a[100];

3.输入数据

从键盘读入。

	//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}

4.数据计算

将首尾交换,然后下标依次增减1。

//四、数据计算 
	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.输出结果

#include<iostream>
using namespace std;
int main(){
	//一、分析问题
	//已知:m个整数
	//未知:逆序输出
	//关系:数组对称交换 

	
	//二、数据定义 
	int n,a[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];
		a[i]=a[n-i-1];
		a[n-i-1]=temp;
	}
	//五、输出结果
	 for(int i=0;i<n;i++){
		
		cout<<a[i]<<" ";
	}
	return 0;	
}

二、数组元素的删除

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

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

在这里插入图片描述
解法一: 不删除,输出数组所有元素,如果遇到下标为x(i == x),则不输出!

1.分析问题

  1. 已知:一个数组
  2. 未知:x个位置的元素删除掉后的数组。
  3. 关系:不删除,跳过输出

2.定义变量

根据分析的已知,未知按需要定义变量。

	//二、数据定义 
	int n,a[100],x;

3.输入数据

从键盘读入。

	//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>x;

4.数据计算

不删除,跳过输出 。

//四、数据计算 
	for(int i=0;i<n;i++){
		if(i!=x-1){
			cout<<a[i]<<" ";
		}
	}

5.输出结果

#include<iostream>
using namespace std;
int main(){
	//一、分析问题
	//已知:一个数组
	//未知:x个位置的元素删除掉后的数组。
	//关系:不删除,跳过输出 

	
	//二、数据定义 
	int n,a[100],x;

	//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>x;
	//四、数据计算 
	for(int i=0;i<n;i++){
		if(i!=x-1){
			cout<<a[i]<<" ";
		}
	}

	//五、输出结果 
	return 0;	
}

解法二: 真删除,将数组中下标为 x的元素删除!从删除下标 x 开始,将元素顺序向前移动!

1.分析问题

  1. 已知:一个数组。
  2. 未知:x个位置的元素删除掉后的数组。
  3. 关系:不删除,跳过输出 。

2.定义变量

根据分析的已知,未知按需要定义变量。

	//二、数据定义 
	int n,a[100],x;

3.输入数据

从键盘读入。

//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>x;

4.数据计算

用后一个元素覆盖掉前一个元素。

//四、数据计算 
	--x;
	for(int i=x;i<n-1;i++){
		a[i]=a[i+1];
	}

5.输出结果

输出时注意数组长度-1,因为删除了1个元素。

#include<iostream>
using namespace std;
int main(){
	//一、分析问题
	//已知:一个数组
	//未知:x个位置的元素删除掉后的数组。
	//关系:不删除,跳过输出 

	
	//二、数据定义 
	int n,a[100],x;

	//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>x;
	//四、数据计算 
	--x;
	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-1~x 结束,将元素顺序后移 (a[i+l] = a[i]),空出下标为x的位置。

在这里插入图片描述

1.分析问题

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

2.定义变量

根据分析的已知,未知按需要定义变量。

	//二、数据定义 
	int n,a[100],x,y;

3.输入数据

从键盘读入。

	//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>x;
	cin>>y;

4.数据计算

将数组向后扩展一位。

//四、数据计算 
	--x;
	for(int i=n;i>=x;i--){
		a[i]=a[i-1];
	}
	a[x]=y;

5.输出结果

#include<iostream>
using namespace std;
int main(){
	//一、分析问题
	//已知:一个数组
	//未知:更新后的数组。
	//关系:x 个位置插入一个新的数y

	
	//二、数据定义 
	int n,a[100],x,y;

	//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>x;
	cin>>y;
	//四、数据计算 
	--x;
	for(int i=n;i>=x;i--){
		a[i]=a[i-1];
	}
	a[x]=y;

	//五、输出结果 
	for(int i=0;i<n+1;i++){
		cout<<a[i]<<" ";
	}
	return 0;	
}

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

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

在这里插入图片描述
思路:
第一步:找出要插入的元素的下标 x;从第一个数开始逐个比较,找到第一个 a[i] >= y,下标 就是x 的值。

第二步:将元素顺序后移(逆序循环 n-1~x)。

第三步:在下标为x的位置插入元素 y。

1.分析问题

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

2.定义变量

根据分析的已知,未知按需要定义变量。

	//二、数据定义 
	int n,m,a[10000],sub;

3.输入数据

从键盘读入。

	//三、数据输入
	cin>>n;
	cin>>m;
	for(int i=0;i<m;i++){
		cin>>a[i];
		if(a[i]<n){
			sub=i+1;
		}
	} 

4.数据计算

//四、数据计算 
	for(int i=m;i>=sub;i--){
		a[i]=a[i-1];
	}
	a[sub]=n;

5.输出结果

#include<iostream>
using namespace std;
int main(){
	//一、分析问题
	//已知:一个整数 n 和一个有序数列
	//未知:新的数列
	//关系:整数 n插入到数列,仍然从小到大排列 
	
	//二、数据定义 
	int n,m,a[10000],sub;
	
	//三、数据输入
	cin>>n;
	cin>>m;
	for(int i=0;i<m;i++){
		cin>>a[i];
		if(a[i]<n){
			sub=i+1;
		}
	} 
	//四、数据计算 
	for(int i=m;i>=sub;i--){
		a[i]=a[i-1];
	}
	a[sub]=n;

	//五、输出结果
	for(int i=0;i<m+1;i++){
		cout<<a[i]<<" ";
	} 
	return 0;	
}

四、练习

问题一:1213 - 删除数组的最小数

在这里插入图片描述
题解:
1213 - 删除数组的最小数
1213 - 删除数组的最小数2

问题二:1157 - 最小数

在这里插入图片描述
题解:
【C++】1157 - 最小数

问题三:1212 - 移动数组元素

在这里插入图片描述
题解:
【C++】1212 - 移动数组元素

问题四:1214 - 在最大数后面插入一个数

在这里插入图片描述

题解:1214 - 在最大数后面插入一个数

问题五:1217 - 小明排队做操迟到

在这里插入图片描述

题解:1217 - 小明排队做操迟到

问题六:1232 - 换位置

在这里插入图片描述
题解:1232 - 换位置

五、总结

以上就是关于数组元素移动的内容,总结的来说如果题目只是对输出内容进行检查,那我们可以进行“偷跑”,但是如果后续还有其他计算操作,那么就需要完成相应的处理。

文章来源:https://blog.csdn.net/qq_39180358/article/details/135556988
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。