🔒 答案已锁定

📖 答案解析 — 星火征途(红色文化) — 中等

算法应用主题赛 · Python · 共 14 题(5单选+5多选+4编程)· 满分 100 分

第 1 题 单选题 2 分
在"革命根据地情报比对"任务中,有集合A和集合B分别表示两组情报来源。以下关于集合操作的描述,正确的是?
A = {"延安", "井冈山", "西柏坡", "瑞金"}
B = {"延安", "瑞金", "遵义", "古田"}
A. A | B 表示交集,结果为 {"延安", "瑞金"}
B. A & B 表示并集,结果为 {"延安", "井冈山", "西柏坡", "瑞金", "遵义", "古田"}
C. A - B 表示差集,结果为 {"井冈山", "西柏坡"}
D. A ^ B 表示并集,结果为 {"延安", "井冈山", "西柏坡", "瑞金", "遵义", "古田"}
✅ 正确答案:C
💡 考点解析:集合运算——|并集、&交集、-差集、^对称差集(在A或B中但不同时存在)
第 2 题 单选题 2 分
在"随机抽选红军战士代表"程序中,使用random模块。以下代码的输出结果可能是?
import random
heroes = ["雷锋", "董存瑞", "黄继光", "邱少云", "刘胡兰"]
chosen = random.choice(heroes)
print(chosen)
A. 每次运行输出都是"雷锋"
B. 每次运行会从列表中随机选择一个英雄名字
C. 输出结果是列表的全部内容
D. 程序会报错,因为choice不是random模块的函数
✅ 正确答案:B
💡 考点解析:random模块——choice()从序列中随机选择一个元素;randint(a,b)生成[a,b]范围内的随机整数
第 3 题 单选题 2 分
在"红军密码递归解码"中,使用递归算法计算全排列种数。以下关于递归的说法,正确的是?
A. 递归函数必须有终止条件,否则会无限递归导致栈溢出
B. 递归函数内部不能调用其他函数
C. 任何递归算法都可以用循环替代,且循环一定更高效
D. Python递归没有深度限制
✅ 正确答案:A
💡 考点解析:递归算法——必须有基准条件(终止条件),递归深度默认约1000层,递归不一定比循环慢
第 4 题 单选题 2 分
在"革命根据地地形建模"中,需要创建一个3行4列的二维列表来存储地形高度。以下哪个代码可以正确创建一个所有元素初始化为0的3×4二维列表?
A. terrain = [[0] * 4] * 3
B. terrain = [[0] * 3] * 4
C. terrain = [[0 for j in range(4)] for i in range(3)]
D. terrain = [[0] * 4 for i in range(3)]
✅ 正确答案:D
💡 考点解析:二维列表的创建——[[0] * 4 for i in range(3)]创建3行4列;A选项虽然也可以创建3×4但存在浅拷贝问题,各行引用相同列表
第 5 题 单选题 2 分
在"英雄战绩排名"中,有一个列表scores = ["张三:85", "李四:92", "王五:78"],需要按分数降序排列。以下关于 sort() 方法 key 参数的说法,正确的是?
A. scores.sort() 默认按分数降序排列
B. scores.sort(key=lambda x: x) 可以按整个字符串排列
C. scores.sort(key=lambda x: int(x.split(":")[1]), reverse=True) 可以按分数降序排列
D. key 参数只能接受内置函数,不能接受lambda表达式
✅ 正确答案:C
💡 考点解析:sort()方法的key参数——可以接受lambda表达式,对每个元素应用key函数后再比较排序
第 6 题 多选题 4 分
在"根据地情报站去重分析"中,需要对来自多个情报站的数据进行集合操作。以下关于集合的说法,正确的有哪些?
A. set([1, 2, 2, 3, 3, 3]) 的结果是 {1, 2, 3},集合自动去除重复元素
B. s.add(4) 可以向集合添加一个元素
C. s.remove(5) 删除元素5,如果5不存在则会报KeyError
D. s.discard(5) 删除元素5,如果5不存在也不会报错
✅ 正确答案:ABCD
💡 考点解析:集合操作——自动去重、add()添加、remove()删除(不存在报错)、discard()删除(不存在不报错)
第 7 题 多选题 4 分
在"红色英雄数据库"中,需要灵活操作字典。以下关于字典方法的说法,正确的有哪些?
A. dict.keys() 返回字典所有键的视图对象
B. dict.values() 返回字典所有值的视图对象
C. dict.popitem() 随机删除并返回字典中的一个键值对(Python 3.7+删除最后插入的)
D. dict.clear() 清空字典中的所有键值对
✅ 正确答案:ABCD
💡 考点解析:字典方法——keys()、values()、items()返回视图;popitem()删除键值对;clear()清空
第 8 题 多选题 4 分
在"革命口号拼接展示"中,需要将列表中的多个口号合并成一个字符串。以下关于字符串拼接的说法,正确的有哪些?
A. ",".join(["A", "B", "C"]) 结果为 "A,B,C"
B. " ".join(["不忘初心", "牢记使命"]) 结果为 "不忘初心 牢记使命"
C. "".join(["红", "军", "长", "征"]) 结果为 "红军长征"
D. join() 方法可以用在任何类型的列表上,包括包含整数的列表
✅ 正确答案:ABC
💡 考点解析:join()方法——将可迭代对象中的字符串用指定分隔符连接;D选项错误,join要求元素都是字符串
第 9 题 多选题 4 分
在"情报数字快速处理"中,使用了map和filter函数。以下关于这两个函数的说法,正确的有哪些?
A. map(int, ["1", "2", "3"]) 返回一个迭代器,将列表中每个字符串转换为整数
B. filter(lambda x: x > 0, [-2, -1, 0, 1, 2]) 返回一个迭代器,过滤出大于0的元素
C. list(map(str, [1, 2, 3])) 的结果是 ["1", "2", "3"]
D. map 和 filter 返回的是列表,可以直接打印查看内容
✅ 正确答案:ABC
💡 考点解析:map()对每个元素应用函数、filter()过滤元素;两者返回迭代器需用list()转换查看
第 10 题 多选题 4 分
在"革命根据地物资报表"中,需要将处理结果写入文件。以下关于文件写入的说法,正确的有哪些?
A. f.write("红军万岁\n") 写入一行并添加换行符
B. 以"a"模式打开文件,新内容会追加到文件末尾,不会覆盖原有内容
C. 以"w"模式打开文件,如果文件已存在,会清空原有内容再写入
D. 写入完成后需要调用f.close()或使用with语句来确保内容被保存
✅ 正确答案:ABCD
💡 考点解析:文件写入——write()写入字符串、"a"追加模式、"w"覆盖模式、关闭文件的重要性
第 11 题 编程操作题 15 分

题目描述:
学校开展"红色英雄故事分享"活动,需要在课堂上随机点名同学来分享。请你编写程序:首先输入n位同学的姓名,然后程序随机抽取一位同学,输出被抽中的同学姓名。确保每次抽取是随机的(使用random模块)。

输入格式:
第一行一个正整数 n(1 ≤ n ≤ 50)。
接下来 n 行,每行一个学生姓名。

输出格式:
一行,格式为"请【姓名】同学分享英雄故事!"

示例输入:

4
张明
李红
王刚
赵芳

示例输出:

请王刚同学分享英雄故事!
✅ 参考答案:
📖 参考代码
import random
n = int(input())
students = []
for i in range(n):
    name = input()
    students.append(name)
chosen = random.choice(students)
print("请" + chosen + "同学分享英雄故事!")
第 12 题 编程操作题 15 分

题目描述:
红军情报站需要检测情报密码的强度。强度评分规则如下(满分5分):
1. 长度 ≥ 8:+1分
2. 包含大写字母:+1分
3. 包含小写字母:+1分
4. 包含数字:+1分
5. 包含特殊字符(!@#$%^&*等):+1分
请你编写程序,输入密码字符串,输出其强度评分(0~5分)。

输入格式:
一行字符串,表示密码。

输出格式:
一行,格式为"密码强度:X分(满分5分)"
示例输入1:
RedArmy1936!
示例输出1:
密码强度:5分(满分5分)
示例输入2:
abc123
示例输出2:
密码强度:3分(满分5分)

示例输入:

示例输出:

✅ 参考答案:
📖 参考代码
password = input()
score = 0
# 规则1:长度 >= 8
if len(password) >= 8:
    score += 1
has_upper = False
has_lower = False
has_digit = False
has_special = False
for ch in password:
    if ch.isupper():
        has_upper = True
    elif ch.islower():
        has_lower = True
    elif ch.isdigit():
        has_digit = True
    else:
        has_special = True
# 规则2-5
if has_upper:
    score += 1
if has_lower:
    score += 1
if has_digit:
    score += 1
if has_special:
    score += 1
print("密码强度:" + str(score) + "分(满分5分)")
第 13 题 编程操作题 20 分

题目描述:
几个革命根据地之间建立了简单的通信网络。网络用一个n×n的矩阵表示,network[i][j] = 1 表示根据地i和根据地j之间有直接的通信线路,network[i][j] = 0 表示没有。network[i][i]始终为1(自己到自己的线路)。请你编写程序:
1. 输入通信矩阵
2. 统计总共有多少条直接通信线路(i到j和j到i算同一条,即只统计network[i][j]=1且i < j的情况)
3. 找出通信线路最多的根据地(即该行中1最多的根据地,不包括自己到自己)

输入格式:
第一行一个正整数 n(2 ≤ n ≤ 20),表示根据地数量。
接下来 n 行,每行 n 个整数(0或1),用空格分隔,表示通信矩阵。

输出格式:
第一行输出"直接通信线路数:X条"
第二行输出"通信最多的根据地:根据地Y,共Z条线路"(根据地编号从1开始,如果并列最多则输出编号最小的)

示例输入:

4
1 1 0 1
1 1 1 0
0 1 1 1
1 0 1 1

示例输出:

直接通信线路数:5条
通信最多的根据地:根据地1,共2条线路
✅ 参考答案:
📖 参考代码
n = int(input())
# 输入通信矩阵
network = []
for i in range(n):
    row = list(map(int, input().split()))
    network.append(row)
# 统计直接通信线路数(i < j)
link_count = 0
for i in range(n):
    for j in range(i + 1, n):
        if network[i][j] == 1:
            link_count += 1
# 统计每个根据地的通信线路数(不包括自己)
max_links = 0
max_base = 1
for i in range(n):
    links = 0
    for j in range(n):
        if i != j and network[i][j] == 1:
            links += 1
    if links > max_links:
        max_links = links
        max_base = i + 1  # 编号从1开始
print("直接通信线路数:" + str(link_count) + "条")
print("通信最多的根据地:根据地" + str(max_base) + ",共" + str(max_links) + "条线路")
第 14 题 编程操作题 20 分

题目描述:
有一篇红色主题文章的文本,需要统计其中每个词出现的频率。请你编写程序,输入一段文本(由空格分隔的单词组成,只包含英文字母,大小写不敏感),统计每个单词出现的次数,并按照出现次数从高到低输出词频排名。如果次数相同,按单词的字典序升序排列。

输入格式:
一行字符串,由英文字母和空格组成(单词之间可能用多个空格分隔)。

输出格式:
每行输出一个单词及其出现次数,格式为"单词:X次",按次数降序排列,次数相同按单词字典序升序。

示例输入:

red army red star long march red army victory

示例输出:

red:3次
army:2次
long:1次
march:1次
star:1次
victory:1次
✅ 参考答案:
📖 参考代码
text = input().strip()
# 将所有单词转为小写并按空格分割
words = text.split()
# 统计词频
word_count = {}
for word in words:
    word_lower = word.lower()
    if word_lower in word_count:
        word_count[word_lower] += 1
    else:
        word_count[word_lower] = 1
# 将字典转为列表并排序
items = []
for word in word_count:
    items.append((word, word_count[word]))
# 排序:按次数降序,次数相同按单词升序
for i in range(len(items)):
    for j in range(i + 1, len(items)):
        if items[i][1] < items[j][1] or (items[i][1] == items[j][1] and items[i][0] > items[j][0]):
            items[i], items[j] = items[j], items[i]
# 输出结果
for word, count in items:
    print(word + ":" + str(count) + "次")