PAT-2021年秋季考试 乙级 7-4 数组与链表 (20 分)

简介: 让我们来设计这样一种数组与链表结合的整数存储的结构 A

题目


让我们来设计这样一种数组与链表结合的整数存储的结构 A:


这种结构首先初始化一个长度为 L 0 的整型数组 A 0 ,返回给用户使用。当用户访问第 i 个元素 A[i] 的时候,如果 0≤i<L 0 ,则 A[i] 对应 A 0 [i],系统就返回 h 0 +i×sizeof(int) 作为要访问的地址,其中 h 0 是数组 A 0 的起始位置,sizeof(int) 是数组元素的大小,这里元素就是 int 型,占 4 个字节。


当用户访问越界时(即 i≥L 0 ),系统将另外开辟一个长度为 L 1 的数组 A 1 。此时 A[i] 对应 A 1 [j](这里 i 和 j 之间的映射关系留给你去推导)。如果 0≤j<L 1 ,则返回 h 1 +j×sizeof(int) 作为要访问的地址,其中 h 1 是数组 A 1 的起始位置。


当 A 1 [j] 继续越界时,系统就按照上述规则继续开辟另一个长度为 L 2 的数组 A 2 ,并以此类推。


本题就请你实现这个系统功能,为用户的任何一次访问返回对应元素的地址。


输入格式: 输入第一行给出两个正整数 N(≤10 4 )和 K(≤10 3 ),分别为最多允许开出的数组个数、以及用户访问的次数。


此后 N 行,每行给出两个正整数,分别是一个数组的初始地址(≤10 7 )和长度(≤100),其间以空格分隔。题目保证这些数组占据的空间无重叠。


最后一行顺序给出 K 个用户访问的数组下标,为区间 [0,2 20 ] 内的整数。


输出格式: 对每个用户访问,在一行中输出对应的地址。但如果用户的访问超出了 N 个数组的存储范围,则这个访问是非法的,要输出 Illegal Access,并且对这个访问不采取任何处理。


最后一行请输出上述过程中一共创建了多少个数组。


输入样例:
6 7
2048 5
128 6
4016 10
1024 7
3072 12
9332 10
2 12 25 50 28 8 39
输出样例:
2056
4020
1040
Illegal Access
3072
140
3116
5


样例说明: 访问 A[2] 即 A 0 [2],元素的地址就是 2048+2×4=2056。


访问 A[12],则只加开 A 1 不够,需要加开 A 2 ,其初始位置 h 2 =4016,则 A[12]=A 2 [1] 的地址就是 4016+1×4=4020。


访问 A[25],则必须加开 A 3 ,其初始位置 h 3 =1024,则 A[25]=A 3 [4] 的地址就是 1024+4×4=1040。


访问 A[50] 超出了允许创建的数组的最大边界,所以是非法访问,新数组未创建。


访问 A[28],则必须加开 A 4 ,其初始位置 h 4 =3072,则 A[28]=A 4 [0] 的地址就是 3072。


访问 A[8]=A 1 [3],所以地址是 128+3×4=140。


访问 A[39]=A 4 [11],地址就是 3072+11×4=3116。


上述访问一共创建了 5 个数组。


解题思路


N, K = map(int,input().split())
# N, K = map(int,"6 7".split())
testList = []
maxLength = 0
neicunDict = dict()
for i in range(N):
    x,y = map(int,input().split())
    # x, y = map(int, "2048 5".split())
    maxLength += y
    testList.append(y)
    neicunDict[i] = x
inputList = list(map(int, input().split()))
# inputList = list(map(int, "2 12 25 50 28 8 39".split()))
maxShuzu = 0
for i in inputList:
    if i >= maxLength:
        print("Illegal Access")
        continue
    for index,y  in enumerate(testList):
        if (i - y)<0:
            neicundizhi = neicunDict[index]
            address = neicundizhi+i*4
            print(address)
            maxShuzu = max(index+1,maxShuzu)
            break
        i -= y
print(maxShuzu)


目录
相关文章
|
1月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
99 64
|
5月前
|
Java
环形数组链表(java)
环形数组链表(java)
|
1月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
17 0
|
3月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
57 0
|
3月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
101 0
|
3月前
|
存储 Java 程序员
"揭秘HashMap底层实现:从数组到链表,再到红黑树,掌握高效数据结构的秘密武器!"
【8月更文挑战第21天】HashMap是Java中重要的数据结构,采用数组+链表/红黑树实现,确保高效查询与更新。构造方法初始化数组,默认容量16,负载因子0.75触发扩容。`put`操作通过计算`hashCode`定位元素,利用链表或红黑树处理冲突。`get`和`remove`操作类似地定位并返回或移除元素。JDK 1.8优化了链表转红黑树机制,提升性能。理解这些原理能帮助我们更高效地应用HashMap。
45 0
|
3月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
44 0
|
4月前
|
存储
数组与链表有什么区别
数组与链表有什么区别
|
5月前
|
存储 算法 Java
数组与链表
数组与链表
|
5月前
|
Java
数组链表(java)
数组链表(java)