求解ACSL初级组练习题:找出列表单索引唯一字符
解决ACSL初级组:找出曾占据列表单个索引的唯一字符
看起来你在ACSL初级组的练习题里卡壳了——要找出所有曾占据列表单个索引的唯一字符对吧?先看看你当前代码里的问题,再一步步解决它:
你的代码问题点
- 你初始化了
idk3但全程没使用它,最后打印它的长度肯定输出0,完全没帮你追踪目标字符 - 你的插入逻辑(
idk.insert(index, i)或idk.insert(0, i))只是在修改原列表,但完全没记录哪些字符曾占据过哪个索引位置,这根本没法满足你要找“曾占据单个索引的唯一字符”的需求 - 原列表
idk初始是["C", "E", "M", "O", "P", "R", "T"],每次插入会让列表变长,但你没同步追踪索引的占用变化
核心思路
要实现需求,咱们得做这几件事:
- 维护一个索引占用记录,每个索引对应一个集合,记录所有曾占据过这个位置的字符
- 严格按照你代码里的插入规则(存在则插在当前位置前,不存在插在开头)模拟操作,每插入一个字符就同步更新索引的占用记录
- 最后筛选出那些只在某一个索引位置出现过,且该索引只有它自己的字符
修正后的代码实现
# 初始列表,用更清晰的变量名 initial_chars = ["C", "E", "M", "O", "P", "R", "T"] # 字典:key是索引,value是该索引曾被哪些字符占据过(用集合去重) index_usage = {i: {char} for i, char in enumerate(initial_chars)} # 处理目标字符串,统一转大写并去除首尾空格 target_str = "computer".upper().strip() for char in target_str: if char in initial_chars: # 找到字符当前在列表中的索引 current_idx = initial_chars.index(char) # 在该索引位置插入字符,原位置及之后的元素后移 initial_chars.insert(current_idx, char) # 更新索引占用记录:插入后,原current_idx及之后的索引都要+1,然后给新的current_idx添加当前字符 new_index_usage = {} for idx in index_usage: if idx < current_idx: new_index_usage[idx] = index_usage[idx] else: new_index_usage[idx + 1] = index_usage[idx] # 记录新插入位置的字符 new_index_usage[current_idx] = {char} index_usage = new_index_usage else: # 字符不在初始列表,插入到开头 initial_chars.insert(0, char) # 更新索引占用记录:所有原有索引+1,新增索引0记录当前字符 new_index_usage = {0: {char}} for idx in index_usage: new_index_usage[idx + 1] = index_usage[idx] index_usage = new_index_usage # 筛选目标字符:那些只出现在一个索引位置,且该索引只有它的字符 unique_single_index_chars = set() # 先收集每个字符对应的所有索引位置 char_to_indices = {} for idx, chars in index_usage.items(): for c in chars: if c not in char_to_indices: char_to_indices[c] = set() char_to_indices[c].add(idx) # 找出只对应一个索引的字符,且该索引只有它自己 for char, indices in char_to_indices.items(): if len(indices) == 1: idx = next(iter(indices)) if len(index_usage[idx]) == 1: unique_single_index_chars.add(char) print("曾占据单个索引的唯一字符:", unique_single_index_chars) print("这类字符的数量:", len(unique_single_index_chars))
代码说明
- 索引占用记录:用
index_usage字典跟踪每个索引的历史字符,确保每一次插入操作都同步更新索引的变化(因为插入会导致后续索引移位) - 字符与索引的映射:最后通过
char_to_indices统计每个字符出现过的所有索引,筛选出只出现在一个索引且该索引只有它的字符,这就是你要找的目标 - 测试结果:运行代码后,处理
COMPUTER会得到{'U'},数量是1——因为只有U是插入到开头后,后续没有其他字符插入到它的位置,所以它只占据过索引0这一个位置,且该索引只有它自己
内容的提问来源于stack exchange,提问作者Andrew Lee
相关产品推荐
相关产品推荐

