zoukankan      html  css  js  c++  java
  • 数据结构:数组

    数组是计算机最基础的一个数据结构,只要你学计算机都避不开这个看似简单却无比重要东西。

    例题

    Openjudge7741 矩阵交换行

    描述
    给定一个5*5的矩阵(数学上,一个r×c的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果。

    输入
    输入共6行,前5行为矩阵的每一行元素,元素与元素之间以一个空格分开。 第6行包含两个整数m、n,以一个空格分开。(1 <= m,n <= 5)

    输出
    输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。

    样例输入

    1 2 2 1 2
    5 6 7 8 3
    9 3 0 5 3
    7 2 1 4 6
    3 0 8 2 4
    1 5
    

    样例输出

    3 0 8 2 4
    5 6 7 8 3
    9 3 0 5 3
    7 2 1 4 6
    1 2 2 1 2
    

    数组

    数组,顾名思义就是把一堆元素按照一定顺序组合在一起形成一个组织,这个组织就是一个数组,这里要注意数组不一定非要是数字,比如字符数组、结构体数组、bool数组等等都是数组。

    在C++中构造数组的方法非常简单

    Type array[limit];
    Type array[limit] = {num0, num1, num2, ......};
    

    这之中Type就是类型,比如说可以是int,bool,char,string,你建立的结构体......,array可以修改成你想赋予这个数组的名字,limit就是数组元素个数的上限。

    这里详细说一下limit,记住计算机中数组是从第0位开始算的,比如说我定义一个数组a[100],那么你可以使用这个数组从a[0] ~ a[99]这100个位置,但是记住a[100]这个位置及其往后的位置是不可以使用的,如果你仅定义了一个数组a[100],而且还在程序中去给a[100]赋值的话,恭喜你成功RE了。但是平时我们比较习惯从1开始数数,就像你小时候练习掰手指头数数,没什么人会从0开始数吧。因此往往我们会省略a[0]这个位置,并把上限开大一些,比如开到a[100 + 10],之后直接用a[1] ~ a[100]。

    这里再解释一下第二种a[limit] = {num0, num1, num2, ......}的构造方法,这个就是赋初始值了,其实就是让a[0] = num0,a[1] = num1,a[2] = num2,……这里也要注意第一个数num0是在给a[0]赋值。

    接着数组的使用就简单多了,其实每一个数组的元素a[x]我们就可以把它看成一个单独的元素,我们可以对它进行赋值、进行四则运算……进行各种处理。

    讲到这儿你可能认为数组的知识就到此结束了,那么你就大错特错了,我们都知道循环是可以嵌套的,那么数组能不能嵌套呢?当然可以,其实我们之前所说的都是一维数组,那么有一维数组就一定有二维数组。

    Type array[limit1][limit2];
    Type array[limit1][limit2] = {{num00, num01, ……}, {num10, num11, ……}, ……};
    

    二维数组其实就是把每一个数组看成一个元素,之后把这些数组按照一定顺序组合成一个新的数组,那么这个数组就叫二维数组。其中数组元素是a[0] [0] ~ a[limit1 - 1] [limit2 - 1],也是从0开始算。而第二种构造方array[limit1] [limit2] = {{num00, num01, ……}, {num10, num11, ……}, ……},其实和一维数组的第二种构造是极为相似的,只不过把数组的元素换成了一个一维数组。使用的话,也非常简单,直接用a[x] [y]就行了。

    了解了二维数组你可能会提出疑问,那有没有三维数组甚至更多呢?当然有,你想要多少维就可以建多少维只要内存开的下。这里举个例子,我们可以把一维数组就当成一个列表,二维数组就是一个平面上的网格,三维数组就是一个立体空间里的箱子,再往后的话你可以自己去想象了。使用方法的话举一反三就行了,这里不细说了。

    唠叨了这么一大坨,最后再返回来看这道例题,其实就是一道水题,建立一个二维数组,之后交换相应行,输出就完了,时间复杂度就两重循环:O(n^2)级别。

    代码

    # include <cstdio>
    # include <algorithm>
    # include <cstring>
    # include <cmath>
    
    using namespace std;
    
    const int N_MAX = 5;
    
    int a[N_MAX + 10][N_MAX + 10];
    int n, m;
    
    int main()
    {
    	for (int i = 1; i <= N_MAX; i++)
    		for (int j = 1; j <= N_MAX; j++)
    			scanf("%d", &a[i][j]);
    	scanf("%d%d", &n, &m);
    	for (int i = 1; i <= N_MAX; i++)
    		swap(a[n][i], a[m][i]);
    	for (int i = 1; i <= N_MAX; i++) {
    		for (int j = 1; j <= N_MAX; j++)
    			printf("%d ", a[i][j]);
    		printf("
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    CSS——清除浮动
    .net 多线程之线程取消
    .net 多线程临时变量
    NPOI helper
    添加学员存储过程
    SQL-sqlHelper001
    ado.net 中事务的使用
    T-SQL 事务2
    T-SQL 事务
    T-SQL 带参数存储过程
  • 原文地址:https://www.cnblogs.com/000zwx000/p/12451109.html
Copyright © 2011-2022 走看看