本章节主要讲述数组的一些基本操作,所有类型都将以题目进行讲解。
学习路线:C++从入门到NOI学习路线
学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲
上一站:c++入门之数组基础一
下一站:
给你 m 个整数,将其逆序输出。
解法一: 不对数组进行改动,直接将数组倒序输出也能满足题目的要求。
根据分析的已知,未知按需要定义变量。
//二、数据定义
int m,a[100];
遍历输入。
//三、数据输入
cin>>m;
for(int i=0;i<m;i++){
cin>>a[i];
}
数组下标是从0开始,到m-1结束。因此倒序输出要反过来,将i做减法。
//四、数据计算
for(int i=m-1;i>=0;i--){
//五、输出结果
cout<<a[i]<<" ";
}
#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次,可以在一张纸上画出数组,在进行对折观察。
根据分析的已知,未知按需要定义变量。
//二、数据定义
int n,a[100];
从键盘读入。
//三、数据输入
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
将首尾交换,然后下标依次增减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;
}
#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;
}
把一个数组的第 x 个位置的元素删除掉。
解法一: 不删除,输出数组所有元素,如果遇到下标为x(i == 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]<<" ";
}
}
#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 开始,将元素顺序向前移动!
根据分析的已知,未知按需要定义变量。
//二、数据定义
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];
}
输出时注意数组长度-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;
}
在一个数组的第 x 个位置插入一个新的数y。
思路:逆序循环下标为 n-1~x 结束,将元素顺序后移 (a[i+l] = a[i]),空出下标为x的位置。
根据分析的已知,未知按需要定义变量。
//二、数据定义
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;
#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;
}
给你一个整数 n 和一个数列(数列个数不超过 1000 ),这个数列保证从小到大排列,现要求将这个整数 n 插入到数列中,使新的数列仍然从小到大排列。
思路:
第一步:找出要插入的元素的下标 x;从第一个数开始逐个比较,找到第一个 a[i] >= y,下标 就是x 的值。
第二步:将元素顺序后移(逆序循环 n-1~x)。
第三步:在下标为x的位置插入元素 y。
根据分析的已知,未知按需要定义变量。
//二、数据定义
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;
#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 - 删除数组的最小数2
题解:
【C++】1157 - 最小数
题解:1232 - 换位置
以上就是关于数组元素移动的内容,总结的来说如果题目只是对输出内容进行检查,那我们可以进行“偷跑”,但是如果后续还有其他计算操作,那么就需要完成相应的处理。