一维数组

本文章隶属于 \(zhzzhzzzz\)一个珂学的世界,笔者为 \(ahawzlc\)

最后更新于:2020.8.23.

一维数组

引子

例 1

输入一个长度为 \(n\) 的序列并倒序输出。

利用前文所述知识,可以尝试用 \(n\) 个变量来存储序列。但是——

如果 \(n \le 10\) 还好,\(n \le 1000\) 呢,\(n \le 1000000\) 呢?估计写完之后人都没了。

所以我们需要一段连续的区间来存储这个序列,而且能够直接修改或查询某个位置的值。

神说:“要有光!”于是就有了光。C++ 的创始人说:“要有数组!”于是就有了数组。

数组的建立与使用

建立

C++中,我们使用数据类型 数组名[数组范围]来建立一个数组。

比如上述 例 1 要求建立的数组,假设数据类型为整型,可以这样来建立:

int a[10000001];

方括号里的数字我们也称为“下标范围”。

等等,为什么数组范围是 \(1000001\) 而不是 \(1000000\)

这是因为,在c++中的数组,a[n]下标范围是 a[0] ~ a[n-1],所以为了存储 \(1\) ~ \(n\) 的数据,数组范围通常开大一点。

引用和修改

数组作为基础数据结构之一,具有可以直接引用和修改的特点。

我们可以直接把 a[i] 理解为 \(a\) 数组第 \(i\) 个位置上的变量。

也就是说,数组某个位置上的数据可以使用一般变量的修改方法来修改。

比如,a[i]=a[i-1];表示将a[i-1]的值赋给a[i]a[i]=a[i]+1a[i]++;表示将a[i]的值加 1 。

memset

在很多题目中,我们可能需要将全部数组赋一个较大或较小的值。

这时候我们可以使用 memset 函数,它存在于 cstring 头文件中。

函数的使用格式:memset(a,0,sizeof(a))memset(a,0,sizeof a) ,其中 a 是数组名,0 为数值,通常使用 16 进制的数据,如常见的值有 \(0x3f\)\(0x7f\) \(-1\) 等。

解决例 1

标准代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int a[1000001];
int main() {
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=n;i>=1;i--) cout<<a[i]<<' ';
	return 0;
}

练习题

例 2 P1047 校门外的树

一遍双重循环,一遍单重循环:

  1. 输入数据,并将所有给定区间内打上标记,表示被挖走了。
  2. 统计没有标记(没有被挖走)的位置的数量。

或者三遍循环,即把上述的双重循环拆开。

标程

#include<iostream>
using namespace std;
bool vis[10005];
int main() {
	int n,m,ans=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++) {
		int l,r;
		cin>>l>>r;
		for(int i=l;i<=r;i++) vis[i]=1;
	}
	for(int i=0;i<=n;i++) if(!vis[i]) ans++;
	cout<<ans;
	return 0;
}

结语

这就是一维数组了,常见的题型就是对一维数组的值进行操作并统计答案。

如有不足之处,请发送邮件至我的邮箱,邮箱见“我的博客——关于我”。

好的,这篇文章到此结束,我们下次再见。

posted @ 2020-08-21 18:30  ahawzlc  阅读(328)  评论(1编辑  收藏  举报