数组
具有相同类型的数据元素按照一定的格式排列起来的集合称为数组。
若干数据类型相同且占用相同存储空间的元素组成的有序序列,每个元素对应唯一的下标,这样的序列称为一维数组。
一维数组初始化时:必须声明数组元素的数据类型、必须确定数组的长度。
二维数组:一维数组中的数据元素又是一个一维数组。
若
表示一个二维数组,则:
三维数组:二维数组中的数据元素又是一个一维数组。
维数组:
维数组中的元素又是一个一维数组结构。
数组的特点
- 数组的结构固定:数组初始化时定义维数和数组长度。
- 除了数组的初始化和销毁外,数组只有获取元素和修改元素的操作,不能删除或新增元素。
数组的存储
一维数组的存储
若
表示一个一维数组,数组中每个元素
都占用
个存储单元,数组元素的下标从 0 开始,则元素
和
的存储地址对应关系为:
其中:
表示第一个元素的存储地址,
表示数组第
个元素的存储地址。
二维数组的存储
二维数组的顺序存储主要有两种方式:以行序为主序、以列序为主序。
二维数组的行存储
若
为
行
列的二维数组,开始存储位置为
,每个元素占用
个存储单元,数组元素
的存储位置为:
二维数组的列存储
若
为
行
列的二维数组,开始存储位置为
,每个元素占用
个存储单元,数组元素
的存储位置为:
n 维数组的存储
因为多维关系与一维存储地址之间存在唯一的映射问题,需要对高维数组元素的存放次序进行约定。
维数组通常有两种存放次序:
- 按行优先顺序:将高位数组元素按行向量的顺序存储,第 个行向量存储在第 个行向量之后。
- 按列优先顺序:将数组元素按列向量的顺序存储,第 个列向量存储在第 个列向量之后。
算法例题
1.异位词判断
例题:给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词(可以假设字符串只包含小写字母)。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
说明:
字母异位词:就是两个字符串中的相同字符的数量要对应相等。
例如,s 等于 “anagram”,t 等于 “nagaram”,s 和 t 就互为字母异位词。因为它们都包含有三个字符 a,一个字符 g,一个字符 m,一个字符 n,以及一个字符 r。而当 s 为 “rat”,t 为 “car”的时候,s 和 t 不互为字母异位词。
解题思路:
一个重要的前提“假设两个字符串只包含小写字母”,小写字母一共也就 26 个,因此:
- 可以利用两个长度都为 26 的字符数组来统计每个字符串中小写字母出现的次数,然后再对比是否相等;
- 可以只利用一个长度为 26 的字符数组,将出现在字符串 s 里的字符个数加 1,而出现在字符串 t 里的字符个数减 1,最后判断每个小写字母的个数是否都为 0。
按上述操作,可得出结论:s 和 t 互为字母异位词。
参考
- 《数据结构(C语言版)》 严魏敏、吴伟民著
- 《数据结构(第3版)》 刘大有等著
- 《搞定数据结构与算法》 苏勇