【真题算法·第一期】数组基本操作与遍历

四季读书网 3 0
【真题算法·第一期】数组基本操作与遍历

从零开始,带你掌握数组的核心概念与常见考法

📖 知识点详解及图示解释

1. 什么是数组?

数组(Array)是存储在连续内存空间中的相同类型元素的集合。在 Python 中,列表(list)是最常用的数组形式,可以存储任意类型的数据。

【真题算法·第一期】数组基本操作与遍历-第1张图片-四季读书网

2. 数组的核心操作

【真题算法·第一期】数组基本操作与遍历-第2张图片-四季读书网

3. 为什么数组可以随机访问?

核心原因:连续内存 + 固定元素大小 = 直接地址计算

数组在内存中是一段连续的空间,每个元素占用的字节数相同(类型一致),因此给定下标 i,CPU 可以直接通过公式计算出第 i 个元素的地址:

Address(a[i]) = BaseAddress + i × ElementSize

【真题算法·第一期】数组基本操作与遍历-第3张图片-四季读书网

O(1) — 无论数组多大,已知数组名(可认为是已知首地址 BaseAddress),一次乘法 + 加法就能定位。

对比链表:

❌ 链表

链表节点离散存储,靠指针链接

找第 i 个元素必须从头遍历 → O(n)

没有地址计算公式可用

✅ 数组

连续内存排列,一次计算直达任意元素 → O(1)

一句话:数组把数据连续排列,CPU 用乘法 + 加法直接算出任意元素的地址,所以能随机访问。

◆ ◆ ◆

4. 数组遍历的常见模式

【真题算法·第一期】数组基本操作与遍历-第4张图片-四季读书网

数组索引的常见陷阱

1下标从 0 开始

数组 a 的第一个元素是 a[0],最后一个元素是 a[n-1]。

2索引越界

访问 a[n] 会导致 IndexError,这是考试中常见的错误选项陷阱。

3负数索引

a[-1] 表示最后一个元素,a[-2] 表示倒数第二个,这在 Python 中非常实用。

🧪 真题举例

【2015年10月·选择题第12题】数组条件判断

原题有如下 Python 程序段:

a = [0, 2, 1, 3, 4, 5]

c = 0

for i in range(3, 6):

    if a[i-2] + a[i-1] == a[i]:

        c = c + 1

print(c)

该程序段运行后,输出的是( )

A. 1    B. 2    C. 3    D. 4

✅ 答案:B

💡 解析:循环检查从索引 3 开始的三组相邻三项是否满足前两项之和等于第三项,满足两次,因此输出 2。

【2018年11月·选择题第11题】随机数 + 条件数组处理

原题有如下 Python 程序段:

import random

a = [0] * 6

for i in range(0, 6):

    a[i] = random.randint(1, 10)

for i in range(0, 5):

    if i % 2 == 0 and a[i] > a[i+1]:

        a[i], a[i+1] = a[i+1], a[i]

    else:

        a[i] = a[i] + 1

print(a)

执行程序后,a 数组各元素可能是( )

A. [11,11,7,9,3,9]    B. [6,2,8,10,5,9]

C. [6,9,3,7,8,12]    D. [3,9,0,8,2,7]

✅ 答案:B

💡 解析:程序先给数组赋 1~10 的随机数,然后对索引 0、2、4 进行可能交换(降序变升序),对索引 1、3 强制 +1。因此索引 0、2、4、5 只能在 1~10 之间,索引 1、3 可为 2~11。只有 B 满足。

【2023年1月·选择题第10题】有序数组插入

原题数组元素 a[0]~a[n-1] 已按升序排列,现要将 a[pos](0 ≤ pos ≤ n-1)的值加 1,并保持数组的有序性不变。实现该功能的程序段如下,方框中应填入的正确代码为:

t = a[pos] + 1 # 新值

i = pos

while ______: # 填空:条件表达式

    a[i] = a[i + 1] # 元素前移

    i += 1

a[i] = t # 插入新值

A. i < n - 1
B. i < n - 1 and t > a[i + 1]
C. i < n - 1 and a[i] > a[i + 1]
D. i <= n - 1 or t > a[i]

✅ 答案:B

💡 解析:新值 t 需要从 pos 开始向右移动,只要没到数组末尾且 t 仍大于下一个元素,就继续后移。因此条件是 i < n-1 and t > a[i+1]。

【2023年1月·选择题第11题】数组遍历与字符串逆序

原题对于任意非空字符串 s,甲、乙程序段输出结果相同,则乙程序段加框处的正确代码为:

# 甲程序段(递归):

def f(s, i):

    if i < len(s):

        return f(s, i + 2) + s[i]

    return ""

# 乙程序段(循环):

n = len(s)

r = ""

for i in range(0, n, 2): # i = 0, 2, 4, ...

    ___(加框处)___ # 需要补全这一行

A. r = s[n-i] + r    B. r = r + s[n-i-1]
C. r = r + s[i]    D. r = s[i] + r

✅ 答案:D

💡 解析:甲程序段 f(s, i) 从索引 0 开始,每次递归调用 f(s, i+2),再把当前字符 s[i] 加到返回结果的后面,所以最终结果是偶数索引倒序;乙循环中 i 按 0, 2, 4, ... 从小到大遍历,因此需要把当前字符 s[i] 不断放到结果的最前面,才能得到倒序。故选 D:r = s[i] + r。

如果这篇文章对你有帮助,欢迎 点赞、分享、推荐

抱歉,评论功能暂时关闭!