编程题汇总(基础算法与数据处理)
整体难度说明 :
字符串最长连续相同字符类 (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:
输入 :plaintextaaabbbaaa输出 :
plaintexta样例解释:字符'a'有两段连续序列(长度3),字符'b'有一段连续序列(长度3),按规则返回最先出现的'a'。
-
样例2:
输入 :plaintextaabbbcc输出 :
plaintextb样例解释:字符'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:
输入 :plaintextaaabbbaaacccbbb输出 :
plaintexta@0,6样例解释:字符'a'的两段连续序列(起始0,长度3;起始6,长度3)和字符'b'的两段连续序列(起始3,长度3;起始12,长度3)均为最长(长度3),选择最先出现的'a',输出其所有起始位置。
-
样例2:
输入 :plaintextcckkjjjxyyyy输出 :
plaintexty@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:
输入 :plaintextaaabbbbaacccdddd输出 :
plaintextb 4 [3, 12]样例解释:字符'b'的连续序列(起始3,长度4)和字符'd'的连续序列(起始12,长度4)均为最长(长度4),选择最先出现的'b',输出字符、长度及所有起始位置。
-
样例2:
输入 :plaintext111222333444555输出 :
plaintext1 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:
输入 :plaintext11122333输出 :
plaintext1:3样例解释:字符'1'(连续3次)和字符'3'(连续3次)均为最长,选择最先出现的'1',输出"1:3"。
-
样例2:
输入 :plaintextaabbccccdd输出 :
plaintextc: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:
输入 :plaintext12输出 :
plaintext3样例解释:12=4+4+4(3个完全平方数),是最少项数;其他方案如12=9+1+1+1(4个)项数更多,因此输出3。
-
样例2:
输入 :plaintext13输出 :
plaintext2样例解释: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:
输入 :plaintext12输出 :
plaintext3 4 + 4 + 4样例解释:12的最少完全平方数拆分方案为3个4之和,输出项数3和方案"4 + 4 + 4"。
-
样例2:
输入 :plaintext13输出 :
plaintext2 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:
输入 :plaintextHello, world! Hello, Python.输出 :
plaintexthello 2 python 1 world 1样例解释:"Hello"转小写为"hello",去除前后标点后统计,出现2次;"world"和"Python"各出现1次,按频次降序输出,频次相同时按字典序排列。
-
样例2:
输入 :plaintextPython is great, world is big. Apple and banana are fruits.输出 :
plaintextis 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:
输入 :plaintextHello world, hello Python! Python is great, world is big. END输出 :
plaintexthello [2] is [2] python [2] world [2] big [1] great [1]样例解释:"hello""is""python""world"各出现2次(频次最高),按字典序升序输出;"big""great"各出现1次,后续输出。
-
样例2:
输入 :plaintextApple apple BANANA banana Cherry cherry. Apple and banana are fruits. END输出 :
plaintextapple [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}]")