2025年第七届全国高校计算机能力挑战赛初赛 Python组 编程题汇总

编程题汇总(基础算法与数据处理)

整体难度说明
字符串最长连续相同字符类 (4 题):难度偏易,核心为线性遍历与多维度信息(字符 / 长度 / 位置)记录,侧重基础字符串处理逻辑与变量维护能力;
完全平方数拆分类 (2 题):难度中等,核心为动态规划(含路径回溯),侧重 DP 状态定义、转移方程设计与拆分方案的结果还原;
英文文本词频统计类 (2 题):基础题难度中等,最后一题("END" 终止 + 严格字母筛选)难度中等偏上,核心为文本预处理(大小写 / 标点)、字典统计与多关键字排序,侧重文本处理细节与排序逻辑把控。

文章目录

  • 编程题汇总(基础算法与数据处理)
  • 一、字符串最长连续相同字符问题
    • [1. 最长连续相同字符(仅输出字符)](#1. 最长连续相同字符(仅输出字符))
    • [2. 最长连续相同字符及其起始位置(字符@下标)](#2. 最长连续相同字符及其起始位置(字符@下标))
    • [3. 最长连续相同字符(字符+长度+起始位置列表)](#3. 最长连续相同字符(字符+长度+起始位置列表))
    • [4. 最长连续相同字符(输出"字符:次数")](#4. 最长连续相同字符(输出“字符:次数”))
  • 二、完全平方数拆分问题
    • [1. 最少完全平方数数量](#1. 最少完全平方数数量)
    • [2. 最少完全平方数数量及划分方案](#2. 最少完全平方数数量及划分方案)
  • 三、英文文本单词词频统计问题
    • [1. 多行英文文本词频统计(输出"单词 次数")](#1. 多行英文文本词频统计(输出“单词 次数”))
    • [2. 以"END"为结束标志的词频统计(输出"单词 [次数]")](#2. 以“END”为结束标志的词频统计(输出“单词 [次数]”))

一、字符串最长连续相同字符问题

相似题目差异总结

  • 核心差异:输出要求不同(仅输出字符、字符+起始位置、字符+长度+起始位置、字符:次数),核心逻辑一致为"遍历统计连续字符长度+记录最大值相关信息"。
  • 核心算法:线性遍历字符串(时间复杂度O(n),n为字符串长度),维护当前连续字符、长度及最大相关信息,适配字符串长度≤100的场景。
  • 优化点:单次遍历完成统计,无需额外空间(除存储结果外);处理边界情况(字符串长度为1、末尾字符为最长连续字符)。

1. 最长连续相同字符(仅输出字符)

题目描述:给定一个字符串s(长度不超过100),找到s中出现的最长的连续相同字符。如果有多个字符的连续长度相同,返回最先出现的字符。

运行条件

  • 总时限:5000毫秒
  • 单组时限:1000毫秒
  • 总内存:320 MB
  • 单组内存:64 MB

输入格式

  • 输入为一个字符串s,字符串长度1≤len(s)≤100,仅包含大小写字母、数字或符号。

输出格式

  • 输出为字符串中最长的连续相同字符(单个字符)。

输入输出样例

  • 样例1:
    输入

    plaintext 复制代码
    aaabbbaaa

    输出

    plaintext 复制代码
    a

    样例解释:字符'a'有两段连续序列(长度3),字符'b'有一段连续序列(长度3),按规则返回最先出现的'a'。

  • 样例2:
    输入

    plaintext 复制代码
    aabbbcc

    输出

    plaintext 复制代码
    b

    样例解释:字符'b'连续出现3次,是最长连续序列,输出'b'。

题解代码

python 复制代码
# 读取输入字符串,去除首尾可能的空白字符(题目保证输入为纯字符串,此处为兼容处理)
s = input().strip()

# 边界处理:如果字符串长度为1,直接输出该字符
if len(s) == 1:
    print(s[0])
    exit()

# 初始化变量:记录最大连续字符、最大长度、当前连续字符、当前长度
max_char = s[0]       # 最先出现的最长连续字符
max_count = 1         # 最长连续长度
current_char = s[0]   # 当前遍历的连续字符
current_count = 1     # 当前连续字符的长度

# 遍历字符串(从第2个字符开始,索引1)
for i in range(1, len(s)):
    # 如果当前字符与上一个字符相同,当前长度+1
    if s[i] == current_char:
        current_count += 1
    else:
        # 不同字符时,判断当前长度是否超过最大长度
        if current_count > max_count:
            max_count = current_count
            max_char = current_char
        # 更新当前字符和长度,开始统计新的连续序列
        current_char = s[i]
        current_count = 1

# 处理字符串末尾的连续序列(可能末尾序列是最长的)
if current_count > max_count:
    max_char = current_char

# 输出结果
print(max_char)

2. 最长连续相同字符及其起始位置(字符@下标)

题目描述:给定一个字符串s(长度1≤len(s)≤100),检测字符串中最长的连续相同字符序列。如果存在多个不同字符的序列长度相同且都为最大值,则选择在字符串中最早出现的字符。程序需要输出该字符以及所有达到该最大长度的序列起始位置,起始下标从0开始。

运行条件

  • 总时限:5000毫秒
  • 单组时限:1000毫秒
  • 总内存:320 MB
  • 单组内存:64 MB

输入格式

  • 输入一行,包含一个字符串s(可包含大小写字母、数字、符号)。

输出格式

  • 输出一行,格式为"字符@起始位置1,起始位置2,...",其中起始位置按出现顺序排列。

输入输出样例

  • 样例1:
    输入

    plaintext 复制代码
    aaabbbaaacccbbb

    输出

    plaintext 复制代码
    a@0,6

    样例解释:字符'a'的两段连续序列(起始0,长度3;起始6,长度3)和字符'b'的两段连续序列(起始3,长度3;起始12,长度3)均为最长(长度3),选择最先出现的'a',输出其所有起始位置。

  • 样例2:
    输入

    plaintext 复制代码
    cckkjjjxyyyy

    输出

    plaintext 复制代码
    y@8

    样例解释:字符'y'的连续序列长度为4(最长),起始位置为8,输出"y@8"。

题解代码

python 复制代码
# 读取输入字符串
s = input().strip()

# 边界处理:字符串长度为1时,直接输出字符@0
if len(s) == 1:
    print(f"{s[0]}@0")
    exit()

# 初始化变量
max_char = s[0]               # 最先出现的最长连续字符
max_length = 1                # 最长连续长度
current_char = s[0]           # 当前连续字符
current_count = 1             # 当前连续长度
# 字典存储每个字符的所有连续序列起始位置(key:字符,value:起始位置列表)
pos_dict = {s[0]: [0]}

# 遍历字符串(从索引1开始)
for i in range(1, len(s)):
    if s[i] == current_char:
        # 当前字符与上一个相同,长度+1
        current_count += 1
    else:
        # 不同字符时,更新最长信息
        if current_count > max_length:
            max_length = current_count
            max_char = current_char
        # 记录新字符的起始位置
        current_char = s[i]
        current_count = 1
        # 若字符不在字典中,初始化列表;否则添加起始位置
        if current_char not in pos_dict:
            pos_dict[current_char] = []
        pos_dict[current_char].append(i)

# 处理末尾的连续序列(可能是最长的)
if current_count > max_length:
    max_length = current_count
    max_char = current_char

# 筛选出该字符所有长度为max_length的起始位置
# 验证:起始位置+max_length ≤ 字符串长度(确保序列完整)
valid_positions = [str(pos) for pos in pos_dict[max_char] if pos + max_length <= len(s)]

# 按格式输出结果
print(f"{max_char}@{','.join(valid_positions)}")

3. 最长连续相同字符(字符+长度+起始位置列表)

题目描述:给定一个字符串s(长度不超过100),找到s中出现的最长的连续相同字符。如果有多个字符的连续长度相同,返回最先出现的字符。输出该字符、其连续长度,以及所有达到该长度的连续序列起始位置列表。

运行条件

  • 总时限:5000毫秒
  • 单组时限:1000毫秒
  • 总内存:320 MB
  • 单组内存:64 MB

输入格式

  • 输入为一个字符串s(可包含大小写字母、数字、符号)。

输出格式

  • 第一行:最长的连续相同字符;
  • 第二行:该字符的连续长度(整数);
  • 第三行:所有达到该长度的连续序列起始位置列表(形如[3, 12])。

输入输出样例

  • 样例1:
    输入

    plaintext 复制代码
    aaabbbbaacccdddd

    输出

    plaintext 复制代码
    b
    4
    [3, 12]

    样例解释:字符'b'的连续序列(起始3,长度4)和字符'd'的连续序列(起始12,长度4)均为最长(长度4),选择最先出现的'b',输出字符、长度及所有起始位置。

  • 样例2:
    输入

    plaintext 复制代码
    111222333444555

    输出

    plaintext 复制代码
    1
    3
    [0, 3, 6, 9, 12]

    样例解释:所有数字的连续序列长度均为3(最长),选择最先出现的'1',输出其长度及所有数字的起始位置(均满足长度3)。

题解代码

python 复制代码
# 读取输入字符串
s = input().strip()

# 初始化变量
max_length = 0                # 最长连续长度
result_char = ''              # 结果字符(最先出现的最长连续字符)
result_positions = []         # 所有达到最长长度的起始位置列表
i = 0                         # 遍历指针(当前连续序列的起始索引)

# 遍历字符串,统计所有连续序列
while i < len(s):
    j = i
    # 找到当前连续序列的结束位置(j指向序列最后一个字符的下一位)
    while j < len(s) and s[j] == s[i]:
        j += 1
    # 计算当前连续序列的长度
    current_length = j - i
    
    # 更新最长信息
    if current_length > max_length:
        max_length = current_length
        result_char = s[i]
        result_positions = [i]  # 重置起始位置列表,添加当前起始位置
    elif current_length == max_length:
        # 长度相同且为最长,判断是否需要更新结果字符(仅首次出现时设置)
        if not result_char:
            result_char = s[i]
        # 添加当前起始位置到列表
        result_positions.append(i)
    
    # 移动指针到下一个连续序列的起始位置
    i = j

# 按格式输出结果
print(result_char)
print(max_length)
# 格式化起始位置列表为[xx,xx,...]形式
print(f"[{','.join(map(str, result_positions))}]")

4. 最长连续相同字符(输出"字符:次数")

题目描述:给定一个字符串s(长度不超过100),找到s中最长的连续相同字符。如果存在多个字符的连续长度相同且都是最大值,则返回在字符串中最早出现的字符。输出格式为"字符:次数"(字符与次数之间用冒号分隔)。

运行条件

  • 总时限:5000毫秒
  • 单组时限:1000毫秒
  • 总内存:320 MB
  • 单组内存:64 MB

输入格式

  • 输入为一个字符串s(可包含大小写字母、数字、符号)。

输出格式

  • 输出为"字符:次数",其中字符为最长连续相同字符,次数为其连续长度。

输入输出样例

  • 样例1:
    输入

    plaintext 复制代码
    11122333

    输出

    plaintext 复制代码
    1:3

    样例解释:字符'1'(连续3次)和字符'3'(连续3次)均为最长,选择最先出现的'1',输出"1:3"。

  • 样例2:
    输入

    plaintext 复制代码
    aabbccccdd

    输出

    plaintext 复制代码
    c:4

    样例解释:字符'c'连续出现4次(最长),输出"c:4"。

题解代码

python 复制代码
# 读取输入字符串,去除首尾空白(兼容可能的输入格式)
s = input().strip()

# 边界处理:字符串长度为1时,直接输出"字符:1"
if len(s) == 1:
    print(f"{s[0]}:1")
    exit()

# 初始化变量
max_char = s[0]       # 最先出现的最长连续字符
max_count = 1         # 最长连续长度
current_char = s[0]   # 当前连续字符
current_count = 1     # 当前连续长度

# 遍历字符串(从索引1开始)
for i in range(1, len(s)):
    if s[i] == current_char:
        # 当前字符与上一个相同,长度+1
        current_count += 1
    else:
        # 不同字符时,更新最长信息
        if current_count > max_count:
            max_count = current_count
            max_char = current_char
        # 重置当前字符和长度
        current_char = s[i]
        current_count = 1

# 处理末尾的连续序列(可能是最长的)
if current_count > max_count:
    max_count = current_count
    max_char = current_char

# 按格式输出结果
print(f"{max_char}:{max_count}")

二、完全平方数拆分问题

相似题目差异总结

  • 核心差异:输出要求不同(仅输出最少项数、输出最少项数+划分方案),核心算法一致为动态规划(DP)求解最少完全平方数之和。
  • 核心算法:动态规划(时间复杂度O(n√n),n为输入整数),dp[i]表示组成i所需的最少完全平方数数量,适配n≤10000的场景。
  • 优化点:预处理完全平方数候选集,避免重复计算;第二题通过路径数组记录拆分方案,回溯得到具体组合。

1. 最少完全平方数数量

题目描述:给定一个正整数n(1≤n≤10000),找到最少的完全平方数(例如1、4、9、16...)使得它们的和等于n。返回这个最少的数量。

运行条件

  • 总时限:5000毫秒
  • 单组时限:1000毫秒
  • 总内存:320 MB
  • 单组内存:64 MB

输入格式

  • 输入为一个正整数n。

输出格式

  • 输出一个整数,表示组成n所需的最少完全平方数数量。

输入输出样例

  • 样例1:
    输入

    plaintext 复制代码
    12

    输出

    plaintext 复制代码
    3

    样例解释:12=4+4+4(3个完全平方数),是最少项数;其他方案如12=9+1+1+1(4个)项数更多,因此输出3。

  • 样例2:
    输入

    plaintext 复制代码
    13

    输出

    plaintext 复制代码
    2

    样例解释:13=4+9(2个完全平方数),是最少项数,输出2。

题解代码

python 复制代码
# 读取输入正整数n
n = int(input())

# 动态规划数组dp:dp[i]表示组成i所需的最少完全平方数数量
# 初始化dp数组为无穷大(表示初始状态下无法组成),dp[0]=0(组成0需要0个完全平方数)
dp = [float('inf')] * (n + 1)
dp[0] = 0

# 遍历从1到n的每个整数,计算最少项数
for i in range(1, n + 1):
    # 遍历所有可能的完全平方数(j^2 ≤ i)
    j = 1
    while j * j <= i:
        square = j * j  # 当前完全平方数
        # 状态转移:dp[i] = min(dp[i], dp[i - square] + 1)
        # 含义:组成i的最少项数 = 组成(i - square)的最少项数 + 1(当前square)
        if dp[i - square] + 1 < dp[i]:
            dp[i] = dp[i - square] + 1
        j += 1

# 输出组成n的最少完全平方数数量
print(dp[n])

2. 最少完全平方数数量及划分方案

题目描述:给定一个正整数n(1≤n≤10000),求将其拆分为完全平方数之和时所需的最小项数,并输出具体的划分方案(用加号连接各个平方数)。

运行条件

  • 总时限:5000毫秒
  • 单组时限:1000毫秒
  • 总内存:320 MB
  • 单组内存:64 MB

输入格式

  • 输入为一个正整数n。

输出格式

  • 第一行:单个整数,表示最小项数;
  • 第二行:划分方案,用加号连接各个平方数(例如"4 + 4 + 4")。

输入输出样例

  • 样例1:
    输入

    plaintext 复制代码
    12

    输出

    plaintext 复制代码
    3
    4 + 4 + 4

    样例解释:12的最少完全平方数拆分方案为3个4之和,输出项数3和方案"4 + 4 + 4"。

  • 样例2:
    输入

    plaintext 复制代码
    13

    输出

    plaintext 复制代码
    2
    4 + 9

    样例解释:13的最少完全平方数拆分方案为4+9(2项),输出项数2和方案"4 + 9"。

题解代码

python 复制代码
# 读取输入正整数n
n = int(input())

# 动态规划数组dp:dp[i]表示组成i所需的最少完全平方数数量
dp = [float('inf')] * (n + 1)
dp[0] = 0  # 基准状态:组成0需要0个

# 路径数组p:p[i]记录组成i时最后一个添加的完全平方数
p = [0] * (n + 1)

# 填充dp数组和路径数组
for i in range(1, n + 1):
    j = 1
    while j * j <= i:
        square = j * j  # 当前完全平方数
        # 状态转移:更新最少项数,并记录路径
        if dp[i - square] + 1 < dp[i]:
            dp[i] = dp[i - square] + 1
            p[i] = square  # 记录最后一个平方数
        j += 1

# 回溯路径,获取拆分方案
result = []
current = n
while current > 0:
    result.append(str(p[current]))  # 添加当前平方数(转为字符串,方便拼接)
    current -= p[current]  # 向前回溯:current = current - 最后一个平方数

# 反转结果列表(回溯得到的是逆序,需转为正序)
result.reverse()

# 按格式输出
print(dp[n])
print(' + '.join(result))

三、英文文本单词词频统计问题

相似题目差异总结

  • 核心差异:输入结束方式不同(多行直接输入、以"END"为结束标志),输出格式不同("单词 次数"、"单词 [次数]"),核心逻辑一致为"文本预处理+词频统计+排序输出"。
  • 核心算法:文本预处理(转小写、过滤标点)→ 词频统计(字典存储)→ 排序(按频次降序、频次相同时按字典序升序),适配总行数≤50、每行长度≤1000的文本。
  • 优化点:使用字符串内置方法高效处理大小写和标点;排序时使用lambda表达式指定多关键字排序规则。

1. 多行英文文本词频统计(输出"单词 次数")

题目描述:设计一个程序,读取用户输入的多行英文文本,统计其中每个单词的出现频次,并按要求输出分析结果。具体要求:1. 使用字典存储单词及其出现次数;2. 所有单词转换为小写形式,不区分大小写;3. 去除单词前后的标点符号,保留单词内部的标点(如撇号、连字符);4. 按频次降序输出,频次相同时按单词字典序升序输出。

运行条件

  • 总时限:5000毫秒
  • 单组时限:1000毫秒
  • 总内存:320 MB
  • 单组内存:64 MB

输入格式

  • 输入包含若干行英文文本,总行数不超过50行,每行长度不超过1000个字符(输入以EOF结束,如终端中Ctrl+D或文件结束)。

输出格式

  • 每行输出一个单词及其出现次数,格式为"单词 次数"。

输入输出样例

  • 样例1:
    输入

    plaintext 复制代码
    Hello, world! Hello, Python.

    输出

    plaintext 复制代码
    hello 2
    python 1
    world 1

    样例解释:"Hello"转小写为"hello",去除前后标点后统计,出现2次;"world"和"Python"各出现1次,按频次降序输出,频次相同时按字典序排列。

  • 样例2:
    输入

    plaintext 复制代码
    Python is great, world is big.
    Apple and banana are fruits.

    输出

    plaintext 复制代码
    is 2
    and 1
    apple 1
    are 1
    banana 1
    big 1
    fruits 1
    great 1
    python 1
    world 1

    样例解释:"is"出现2次(频次最高),其余单词各出现1次,按字典序升序输出。

题解代码

python 复制代码
import sys
import string

# 初始化字典,用于存储单词及其出现次数
word_freq = {}

# 读取多行输入(直到EOF)
for line in sys.stdin:
    # 按空格分割行,得到单词列表
    for word in line.split():
        # 预处理单词:1. 转为小写;2. 去除前后标点符号
        # string.punctuation包含所有标点符号,strip()去除首尾指定字符
        cleaned_word = word.lower().strip(string.punctuation)
        # 过滤空字符串(避免纯标点被统计)
        if cleaned_word:
            # 更新词频:存在则次数+1,不存在则初始化为1
            word_freq[cleaned_word] = word_freq.get(cleaned_word, 0) + 1

# 排序:1. 按频次降序(-x[1]);2. 频次相同时按单词字典序升序(x[0])
sorted_items = sorted(word_freq.items(), key=lambda x: (-x[1], x[0]))

# 输出结果
for word, count in sorted_items:
    print(f"{word} {count}")

2. 以"END"为结束标志的词频统计(输出"单词 [次数]")

题目描述:编写一个程序,分析输入文本中各个单词的出现频率,并显示统计结果。具体要求:1. 使用字典记录单词及其出现次数;2. 不区分单词大小写(统一转为小写);3. 过滤标点符号,仅统计由字母组成的有效单词;4. 按词频从高到低输出,频次相同时按单词字典序升序输出;5. 输入以单独一行的"END"作为结束标志。

运行条件

  • 总时限:5000毫秒
  • 单组时限:1000毫秒
  • 总内存:320 MB
  • 单组内存:64 MB

输入格式

  • 输入多行文本内容,以单独一行的字符串"END"作为输入结束标志("END"不参与统计)。

输出格式

  • 每行输出"单词 [出现次数]",其中次数用方括号括起来。

输入输出样例

  • 样例1:
    输入

    plaintext 复制代码
    Hello world, hello Python!
    Python is great, world is big.
    END

    输出

    plaintext 复制代码
    hello [2]
    is [2]
    python [2]
    world [2]
    big [1]
    great [1]

    样例解释:"hello""is""python""world"各出现2次(频次最高),按字典序升序输出;"big""great"各出现1次,后续输出。

  • 样例2:
    输入

    plaintext 复制代码
    Apple apple BANANA banana Cherry cherry.
    Apple and banana are fruits.
    END

    输出

    plaintext 复制代码
    apple [3]
    banana [3]
    cherry [2]
    and [1]
    are [1]
    fruits [1]

    样例解释:"apple"出现3次(Apple、apple、Apple),"banana"出现3次(BANANA、banana、banana),"cherry"出现2次,其余各1次,按规则排序输出。

题解代码

python 复制代码
import sys

# 初始化字典,存储单词及其出现次数
word_freq = {}

# 循环读取输入行,直到遇到"END"
while True:
    # 读取一行输入,去除首尾空白(包括换行符)
    line = sys.stdin.readline().strip()
    # 若读取到空行(EOF)或"END",退出循环
    if not line or line == "END":
        break
    # 按空格分割单词
    for word in line.split():
        # 预处理单词:1. 转为小写;2. 过滤非字母字符(仅保留字母)
        cleaned_word = ''.join(char for char in word.lower() if char.isalpha())
        # 过滤空字符串
        if cleaned_word:
            word_freq[cleaned_word] = word_freq.get(cleaned_word, 0) + 1

# 排序:按频次降序,频次相同时按字典序升序
sorted_items = sorted(word_freq.items(), key=lambda x: (-x[1], x[0]))

# 按格式输出结果
for word, count in sorted_items:
    print(f"{word} [{count}]")
相关推荐
Q_Q51100828538 分钟前
python+django/flask的结合人脸识别和实名认证的校园论坛系统
spring boot·python·django·flask·node.js·php
Q_Q51100828539 分钟前
python+django/flask的选课系统与课程评价整合系统
spring boot·python·django·flask·node.js·php
程序员小白条41 分钟前
你面试时吹过最大的牛是什么?
java·开发语言·数据库·阿里云·面试·职场和发展·毕设
charlie11451419144 分钟前
勇闯前后端Week2:后端基础——Flask API速览
笔记·后端·python·学习·flask·教程
小年糕是糕手1 小时前
【C++】类和对象(二) -- 构造函数、析构函数
java·c语言·开发语言·数据结构·c++·算法·leetcode
豐儀麟阁贵1 小时前
8.2异常的抛出与捕捉
java·开发语言·python
权泽谦1 小时前
PHP 版羊了个羊完整开发实战:逻辑解析 + 三消算法 + 全套接口(附源码)
开发语言·php
程序员西西1 小时前
SpringBoot无感刷新Token实战指南
java·开发语言·前端·后端·计算机·程序员
Coding_Doggy1 小时前
链盾shieldchiain | 团队功能、邀请成员、权限修改、移除成员、SpringSecurity、RBAC权限控制
java·开发语言·数据库