华为OD机试_2025 B卷_字符串分割(Python,100分)(附详细解题思路)
题目
给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。
对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;
反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;大小写字母的数量相等时,不做转换
输入描述
输入为两行,第一行为参数K,第二行为字符串S
输出描述
输出转换后的字符串
用例一:
输入:
3
12abc-abCABc-4aB@
输出:
12abc-abc-ABC-4aB-@
用例二:
输入:
12
12abc-abCABc-4aB@
输出:
12abc-abCABc4aB@
字符串分隔转换算法详解
核心解题思路
本题目要求我们处理一个由-
分隔的字符串,根据指定长度K重新拆分后续子串,并根据大小写字母比例进行转换。核心思路可分为以下几步:
- 分割原始字符串:先用
-
将字符串拆分为多个子串 - 处理第一部分:保留第一个子串不变
- 重组后续部分:将剩余子串合并后按K长度重新分组
- 大小写转换:统计每组中大小写字母数量,按规则转换
- 重组结果:将处理后的组用
-
连接
关键点说明
- 大小写转换规则:
- 小写字母多 → 全转小写
- 大写字母多 → 全转大写
- 数量相等 → 不变
- 特殊字符处理:非字母字符(数字、符号等)保持不变
- 分组规则:除首个子串外,其余部分合并后按K长度分组,不足K的单独成组
完整代码实现
def transform_string():# 读取输入K = int(input().strip())S = input().strip()# 分割原始字符串parts = S.split('-')# 处理特殊情况:只有一个部分if len(parts) == 1:print(S)return# 保留第一部分result = [parts[0]]# 合并后续部分merged_str = ''.join(parts[1:])# 按K长度分组groups = []start = 0while start < len(merged_str):# 获取当前分组group = merged_str[start:start+K]groups.append(group)start += K# 处理每个分组for group in groups:lower_count = 0upper_count = 0# 统计大小写字母数量for char in group:if 'a' <= char <= 'z':lower_count += 1elif 'A' <= char <= 'Z':upper_count += 1# 根据规则转换if lower_count > upper_count:# 全转小写new_group = ''.join(char.lower() if 'A' <= char <= 'Z' else char for char in group)elif upper_count > lower_count:# 全转大写new_group = ''.join(char.upper() if 'a' <= char <= 'z' else char for char in group)else:# 数量相等,保持不变new_group = groupresult.append(new_group)# 输出结果print('-'.join(result))# 执行函数
transform_string()
算法原理解析
1. 字符串分割与重组
parts = S.split('-')
merged_str = ''.join(parts[1:])
split('-')
:将原始字符串按-
拆分为列表join(parts[1:])
:合并除第一部分外的所有子串
2. 分组处理
while start < len(merged_str):group = merged_str[start:start+K]start += K
- 滑动窗口按K长度截取子串
- 自动处理尾部不足K的情况
3. 大小写统计与转换
for char in group:if 'a' <= char <= 'z': lower_count += 1elif 'A' <= char <= 'Z':upper_count += 1
- 精确统计大小写字母数量
- 非字母字符不影响统计结果
4. 转换规则应用
if lower_count > upper_count:# 转小写
elif upper_count > lower_count:# 转大写
else:# 保持不变
- 仅转换字母字符
- 非字母字符保持原样
- 数量相等时不操作
示例解析
示例1:输入3
和12abc-abCABc-4aB@
-
初始分割:
parts = ["12abc", "abCABc", "4aB@"]
- 第一部分保留:
"12abc"
-
合并后续:
merged_str = "abCABc4aB@"
-
按K=3分组:
["abC", "ABc", "4aB", "@"]
-
分组处理:
分组 小写字母 大写字母 操作 结果 abC a,b(2) C(1) 转小写 abc ABc c(1) A,B(2) 转大写 ABC 4aB a(1) B(1) 不变 4aB @ 0 0 不变 @ -
最终输出:
"12abc-abc-ABC-4aB-@"
示例2:输入12
和12abc-abCABc-4aB@
-
初始分割:
parts = ["12abc", "abCABc", "4aB@"]
- 第一部分保留:
"12abc"
-
合并后续:
merged_str = "abCABc4aB@"
(长度9)
-
按K=12分组:
["abCABc4aB@"]
(仅1组)
-
分组处理:
- 小写字母:a,b,c,a(4个)
- 大写字母:C,A,B,B(4个)
- 数量相等 → 不变
-
最终输出:
"12abc-abCABc4aB@"
总结与拓展
关键知识点
- 字符串处理:split/join操作
- 滑动窗口:按固定长度分组
- 字符统计:大小写字母识别
- 条件转换:基于统计结果的字符串转换
拓展思考
- 多分隔符处理:如何支持多个不同分隔符
- 动态K值:K值根据内容动态调整
- 并行处理:大数据量时分组并行计算
- 国际化支持:处理非英文字符(如中文、阿拉伯文)
本解法通过清晰的分步处理,完美实现了题目要求的转换功能。初学者可从中学习:
- 字符串拆分与重组技巧
- 分组统计的实现方法
- 条件转换的逻辑设计
- 边界情况的处理策略
核心启示:字符串处理的关键在于分解问题,将复杂需求拆分为独立的处理步骤,再组合解决。