【奇妙的数据结构世界】 用经典例题对数组进行全面分析 | C++

news2024/11/15 12:25:23

第八章    数组


目录

第八章    数组

●前言

●一、数组是什么?

1.简要介绍

2.具体情况

●二、数组典型例题——一维&二维&三维

1.一维数组(校门外的树)

2.二维数组(彩票摇奖)

3.三维数组(工艺品制作)

●总结


前言

        简单来说,数据结构是一种辅助程序设计并且进行优化的方法论,它不仅讨论数据的存储与处理的方法,同时也考虑到了数据彼此之间的关系与运算,从而极大程度的提高程序执行的效率,减少对内存空间的占用等。不同种类的数据结构适用于不同的程序应用,选择合适正确的数据结构,可以让算法发挥出更大的性能,给设计的程序带来更高效率的算法。


一、数组是什么?

1.简要介绍

        数组类型是一种典型的静态数据结构,它使用了连续分配的内存空间去存储数据内容。静态数据结构是在编译时就给其变量分配好一定大小的内存空间。在建立静态数据结构的初期,必须事先去声明可能要占用多大的固定内存空间,因此这样可能造成一定的内存浪费或是经过后续操作出现数据溢出的现象。当对于简单的程序设计问题时,我们可以利用其下标,充分的对每一个位置上的数据进行修改、读取和使用,但是如果进行删除或插入数据的操作时将会移动大量的数据元素。

2.具体情况

        数组是具有相同和数据类型的变量的集合,它们在内存中占有一块连续的内存空间。数组可以分为一维数组、二维数组和多维数组,平时的学习中一维和二维是常用的,多维数组的话一般就会涉及到一些复杂的空间问题。在如下的图一中,是一个一维数组array_1[7],它是拥有6个相同数据类型的数组。

图一

         二维数组可以视为一维数组的扩展,它与一维数组差别只在于维数的声明。在如下的图二中,是一个二维数组array_2[4][5]在直观平面上的具体排列方式。

图二

         三维数组的表示法和二维数组一样,都可以视作一维数组的扩展。在如下的图三中,是一个三维数组array_3[2][3][4]将它想象成空间上的立方体的情况。

图三

二、数组典型例题——一维&二维&三维

1.一维数组(校门外的树)

①例题:

        某校大门外长度为 l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 l 的位置;数轴上的每个整数点,即 0、1、2、...、l,都种有一棵树。
        由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

        输入要求:分析后可知需要输入马路的长度l,区域的数目m。m行的两个整数u和v,分别来表示一个区域的起点和终点坐标;

        输出要求:输出一个整数,表示移走每个区域上的树后剩余的树的数目;

        数据要求:1≤l≤10000、1≤m≤100、0≤u≤v≤l;

②代码展示:

#include<iostream>
using namespace std;
int tree_num[10001];
class tree {
public:
	int l,m;
	int u[101], v[101];
	void calculator()
	{
		for (int i = 0; i < m; i++)
		{
			for (int j = u[i]; j <= v[i]; j++)
			{
				tree_num[j] = 1;
			}
		}
		int count = 0;
		for (int k = 0; k <= l; k++)
		{
			if (tree_num[k] == 0)
				count++;
		}
		cout << "剩余" << count << "棵树" << endl;
	}
};
void text()
{
	tree t;
	cout << "请输入马路的长度:";
	cin >> t.l; 
	cout << "请输入区域的个数:";
	cin >> t.m;
	cout << "请开始分别输入" << t.m << "个区域的始点和终点坐标" << endl;
	for (int i = 0; i < t.m; i++)
	{
		cin >> t.u[i] >> t.v[i];
	}
	t.calculator();
}
int main()
{
	text();
}

③代码结果展示:

2.二维数组(彩票摇奖)

①例题:

        为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。该彩票的规则是:

1. 每张彩票上印有 7 个各不相同的号码,且这些号码的取值范围为 1~33。
2. 每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码。
3. 共设置 7 个奖项,特等奖和一等奖至六等奖。

兑奖规则如下:
        - 特等奖:要求彩票上 7 个号码都出现在中奖号码中。
        - 一等奖:要求彩票上有 6 个号码出现在中奖号码中。
        - 二等奖:要求彩票上有 5 个号码出现在中奖号码中。
        - 三等奖:要求彩票上有 4 个号码出现在中奖号码中。
        - 四等奖:要求彩票上有 3 个号码出现在中奖号码中。
        - 五等奖:要求彩票上有 2 个号码出现在中奖号码中。
        - 六等奖:要求彩票上有 1 个号码出现在中奖号码中。

注:兑奖时并不考虑彩票上的号码和中奖号码中的各个号码出现的位置。例如,中奖号码为 23、31、1、14、19、17、18,则彩票 12、8、9、23、1、16、7由于其中有两个号码(23和1)出现在中奖号码中,所以该彩票中了五等奖。现已知中奖号码和小明买的若干张彩票的号码,请你写一个程序帮助小明判断他买的彩票的中奖情况。

        输入要求:输入的第一行只有一个自然数 n,表示小明买的彩票张数;第二行存放了 7 个介于 1 和 33 之间的自然数,表示中奖号码;在随后的 n 行中每行都有 7 个介于 1 和 33 之间的自然数,分别表示小明所买的 n 张彩票;

        输出要求:依次输出小明所买的彩票的中奖情况(中奖的张数),首先输出特等奖的中奖张数,然后依次输出一等奖至六等奖的中奖张数。

        数据要求:1≤n<1000

 ②代码展示:

#include<iostream>
using namespace std;
int number[1001];
class lottery {
public:
	int n;
	int arr_1[7];
	int arr_2[1001][7];
	void calculator_1()
	{
		for (int i = 0; i < n; i++)
		{
			int count = 0;
			int ans = 0;
			while (ans < 7)
			{
				for (int j = 0; j < 7; j++)
				{
					if (arr_2[i][j] == arr_1[ans])
						count++;
				}
				ans++;
			}
			number[i] = count;
		}
	}
	void calculator_2()
	{
		int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0;
		for (int i = 0; i < n; i++)
		{
			switch (number[i])
			{
			case 1:
				g++;
				break;
			case 2:
				f++;
				break;
			case 3:
				e++;
				break;
			case 4:
				d++;
				break;
			case 5:
				c++;
				break;
			case 6:
				b++;
				break;
			case 7:
				a++;
				break;
			}
		}
		cout << "分别对应中奖情况如下:(特等-一等-二等-三等-四等-五等-六等)" << endl;
		cout << a << " " << b << " " << c << " " << d << " " << e << " " << f << " " << g << endl;
	}
};
void text()
{
	lottery l;
	cout << "请输入购买彩票的张数:";
	cin >> l.n;
	cout << "请输入彩票的7位中奖号码:";
	for (int i = 0; i < 7; i++)
	{
		cin >> l.arr_1[i];
	}
	cout << "请输入购买彩票的号码:" << endl;
	for (int i = 0; i < l.n; i++)
	{
		for (int j = 0; j < 7; j++)
		{
			cin >> l.arr_2[i][j];
		}
	}
	l.calculator_1();
	l.calculator_2();
}
int main()
{
	text();
}

 ③代码结果展示:

3.三维数组(工艺品制作)

①例题:

        现有一个长宽高分别为 w,x,h 组成的实心玻璃立方体,可以认为是由 1✖1✖1 的数个小方块组成的,每个小方块都有一个坐标( i,j,k )。现在需要进行q次切割。每次切割给出 (x1,y1,z1),(x2,y2,z2)这6个参数,保证 x1<=x2,y1<=y2,z1<=z2;每次切割时,使用激光工具切出一个立方体空洞,空洞的壁平行于立方体的面,空洞的对角点就是给出的切割参数的两个点。

        换句话说,所有满足 x1<=i<=x2 , y1<=j<=y2 , z1<=k<=z2 的小方块(i,j,k)的点都会被激光蒸发。例如有一个 4✖4✖4 的大方块,其体积为64;给出参数(1,1,1),(2,2,2)时,中间的8块小方块就会被蒸发,剩下56个小方块。现在想知道经过所有切割操作后,剩下的工艺品还剩下多少格小方块的体积。 

        输入要求:分别输入长宽高三个正整数w、x、h。一个整数q,然后在接下来的q行,每行6个整数(x1,y1,z1),(x2,y2,z2)分别表示对角的两个顶点坐标;

        输出要求:输出一个整数表示切割后还剩余多少个小立方体;

        数据要求:1≤w,x,h≤20、1≤q≤100、1≤x1​≤x2​≤w、1≤y1​≤y2​≤x、1≤z1​≤z2​≤h;

②代码展示:

#include<iostream>
using namespace std;
#define max 21
int sq[max][max][max] = {0};
class art {
public:
	int w, x, h;
	int x1, y1, z1;
	int x2, y2, z2;
	void calculator_1()
	{
		for (int i = x1; i <= x2; i++)
			for (int j = y1; j <= y2; j++)
				for (int k = z1; k <= z2; k++)
					sq[i][j][k] = 1;
	}
	void calculator_2()
	{
		int count=0;
		for (int i = 1; i <= w; i++)
			for (int j = 1; j <= x; j++)
				for (int k = 1; k <= h; k++)
					if (sq[i][j][k] == 0)
						count++;
		cout << "剩余" << count << "个小方块" << endl;
	}
};
void text()
{
	art a;
	cout << "请输入长宽高:";
	cin >> a.w >> a.x >> a.h;
	cout << "请输入q的值:";
	int q; cin >> q;
	cout << "请分别输入两组对角点的坐标值" << endl;
	for (int num = 1; num <= q; num++)
	{
		 cin >> a.x1 >>a.y1 >> a.z1;
		 cin >> a.x2 >>a.y2>> a.z2;
		 a.calculator_1();
	}
	a.calculator_2();
}
int main()
{
	text();
}

③代码结果展示:


 总结

        以上就是我们第八章的全部讲解与典型例题,因为上面这三个例题更大程度上是数组和算法的结合应用,所以对于C++的一些初学者来说,上面的三个例题是有一定难度和挑战性的。但是如果可以独立且正确的去完成,那么你在数据结构数组这一块就可以打个对勾了。

                                               <您的三连和关注是我最大的动力>

                       🚀 文章作者:Keanu Zhang        分类专栏:算法之美(C++系列文章)

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

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

相关文章

自己动手写一个操作系统——MBR(1)

文章目录前言MBR1) 512 字节镜像2) 0x55 和 0xAAqemu 运行参考前言 上篇《自己动手写一个操作系统——我们能做什么&#xff0c;我们需要做什么》我们介绍到 BIOS 会遍历每个磁盘的第一个扇区查找 MBR&#xff0c;找到后便将 MBR 加载到内存并跳转过去。如果没找到&#xff0c…

红黑树和平衡二叉树的区别

一.红黑树的定义 1.节点是红色或者黑色&#xff1b; 2.根节点和叶子节点是黑色&#xff0c;叶子节点为空节点&#xff1b; 3.每个红色节点的叶子节点都是黑色&#xff1b; 4.从任何节点到叶子节点的所有路径包含相同数目的黑色节点&#xff1b; 5.红黑树实现平衡和保持红黑…

代码随想录算法训练营三期 day 25 - 回溯 (2) (补)

216. 组合总和III 题目描述: 216. 组合总和 III 原文链接: 216. 组合总和 III 视频链接: 216. 组合总和 III 树形结构 回溯三部曲&#xff1a; ① 确定回溯函数参数及返回值 和 77. 组合 一样&#xff0c;依然需要一维数组 path 来存放符合条件的结果&#xff0c;二维数组 r…

leetcode-每日一题-计算应缴税款总额(简单,数学逻辑)

给你一个下标从 0 开始的二维整数数组 brackets &#xff0c;其中 brackets[i] [upperi, percenti] &#xff0c;表示第 i 个税级的上限是 upperi &#xff0c;征收的税率为 percenti 。税级按上限 从低到高排序&#xff08;在满足 0 < i < brackets.length 的前提下&am…

(19)go-micro微服务filebeat收集日志

文章目录一 Filebeat介绍二 FileBeat基本组成三 FileBeat工作原理四 Filebeat如何记录文件状态:五 Filebeat如何保证事件至少被输出一次六 安装Filebeat七 使用Filebeatfilebeat.yml编写八 最后一 Filebeat介绍 filebeat是Beats中的一员。 Beats在是一个轻量级日志采集器&…

2022——>2023

2022年对于我来说&#xff0c;是极其不平凡的一年&#xff0c;因为在这一年&#xff0c;我面临了人生的第一次重大的选择——高考。老师们常说&#xff1a;“一分压倒一操场人。”这句话是我高考看完自己的成绩之后深有体会的。超过湖南本科线没几分的我&#xff0c;志愿真的是…

剖析“类和对象” (中) -------- CPP

在上一篇博客中 (剖析“类和对象” (上) -------- CPP) 提到&#xff0c;一个类中什么成员都没有的称为“空类”。一个“空类”中真的什么都没有吗&#xff1f; 其实不然&#xff0c;任何类中什么都不写时&#xff0c;编译器会自动生成一下六个默认成员函数。 默认成员函数&am…

Fisco Bcos区块链二(搭建使用控制台,体验Holleworld合约调用)

文章目录区块链开荒技术文档&#xff1a;https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html2. 配置及使用控制台准备依赖启动并使用控制台3. 部署及调用HelloWorld合约编写HelloWorld合约&#xff08;此处不需要编写&#xff0c;控制台已内置&#xff…

【每日一道智力题】之海盗分金币(上)

文章目录题目&#xff1a;解答&#xff1a;题目变形&#xff1a;解答&#xff1a;总结题目&#xff1a; 5个海盗抢到了100枚金币&#xff0c;每一颗都一样的大小和价值。 他们决定这么分&#xff1a; 抽签决定自己的号码&#xff08;1&#xff0c;2&#xff0c;3&#xff0c;4…

IDEA 2022 创建 Spring Boot 项目详解

如何用 IDEA 2022 创建并初始化一个 Spring Boot 项目&#xff1f; 目录 如何用IDEA 2022创建并初始化一个Spring Boot项目&#xff1f; 0. 环境说明 1. 创建Spring Boot项目 2. 编写初始化代码 0. 环境说明 IDEA 2022.3.1JDK 1.8Spring Boot 1. 创建 Spring Boot 项目…

Linux常用命令——smbclient命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) smbclient 交互方式访问samba服务器 补充说明 smbclient命令属于samba套件&#xff0c;它提供一种命令行使用交互式方式访问samba服务器的共享资源。 语法 smbclient(选项)(参数)选项 -B<ip地址>&…

【SpringCloud20】SpringCloud Alibaba Seata处理分布式事务

目录1.分布式事务问题2.Seata简介2.1 是什么2.2 作用2.3 下载2.4 如何使用3.Seata-Server安装3.1 下载网址3.2 下载版本3.3 seata解压到指定目录并修改文件3.3.1 nacos新增配置文件3.3.2 修改application.yml3.4 数据库新建seata3.5 在seata里建表3.6 启动Nacos端口号88483.7 启…

Spring介绍

Spring是分层的全栈式的轻量级开发框架,以IOC和AOP为核心,官网是https://spring.io Spring优势 1 方便解耦,简化开发 Spring通过容器,将对象的创建从代码中剥离出来,交给Spring控制,避免直接编码造成模块之间的耦合度高,用户也不必自己编码处理对象的单例和多例控制,主要关注接…

C语言基础知识(36)

C语言中的数组和指针有什么区别数组和指针之间的一个重要区别是数组中元素的地址始终是固定的&#xff0c;不能在执行时修改地址&#xff0c;但对于指针&#xff0c;可以根据需要更改指针的地址。分支结构1.简单if语句C语言中的分支结构语句中的if条件语句。简单if语句的基本结…

Linux内核驱动初探(一) LVDS显卡

目录 0. 前言 1. menuconfig 2. 编译报错与打补丁 3. 设备树与display-timings 4. 拓展&#xff1a;RGB24 0. 前言 这次的工作主要是把某项目设备上(iMX6DL)的内核版本从 4.19.x 升级到 5.15.32&#xff0c;是作为该项目整个BSP升级计划的一部分。 该内核升级工作移交给…

PX4+Offboard模式+代码控制无人机起飞(Gazebo)

参考PX4自动驾驶用户指南 https://docs.px4.io/main/zh/ros/mavros_offboard_cpp.html 新建ros项目工程 mkdir -p px4_offboard_ws/src接着进入文件编译一下 cd px4_offboard_ws catkin_make进入src目录&#xff0c;创建ros功能包 catkin_create_pkg t1_offboard_rtakeoff …

Springboot+vue基于java的家教管理平台

系统分为用户和管理员&#xff0c;教师三个角色 用户的主要功能有&#xff1a; 1.用户注册和登陆系统 2.查看系统的公告信息 3.用户查看家教教师简历信息 4.用户查看课程信息 5.用户查看招聘教师信息&#xff0c;在线应聘教师 6.用户个人中心修改个人资料&#xff0c;修改密码…

Python数据清洗2

一、函数数据处理 1.在dataframe中使用apply方法&#xff0c;调用自定义函数对数据进行处理 2.可以使用astype函数对数据进行转换 3.可以使用map函数进行数据转换 二、数据分组运算 1.使用groupby方法进行分组计算&#xff0c;得到分组对象GroupBy 2.语法为df.groupby(…

在甲骨文云容器实例(Container Instances)上部署chrome

甲骨文云推出了容器实例&#xff0c;这是一项无服务器计算服务&#xff0c;可以即时运行容器&#xff0c;而无需管理任何服务器。 今天我们尝试一下通过容器实例部署chrome。 Step1. 创建容器实例 在甲骨文容器实例页面&#xff0c;单击"创建容器实例"&#xff0c;…

LInux(四)进程控制(创建、终止、等待、替换)

目录 一、进程创建 1、pid_t fork(void) 2、写时拷贝技术&#xff08;父子进程间代码共享、数据独有&#xff09; 3、vfork()--创建一个子进程 4、fork创建子进程流程是什么样的&#xff1f; 5、一个关于fork的程序 6、程序a 7、 程序b 二、进程终止 1、在main函数中…