如何用Python找出升序排列单词中的缺失字母?
问题分析与代码修正
首先你的代码存在以下几个核心问题:
- 逻辑分支完全颠倒:本该处理含
*场景的代码,被放到了if '*' not in word分支中;全*场景的处理逻辑也错误。 - 未初始化列表:
new_left_letters和new_right_letters未提前定义,运行会直接抛出NameError。 - 未考虑多可见字母的中间约束:比如两个可见字母之间的
*,需要填入两者之间的字母,原代码仅单方向对比单个字母,逻辑不完整。 - 未排除原单词中已有的字母:示例中的
d和m会被错误加入结果。 - 重复添加字母:多个
*位置允许同一个字母时,结果列表会出现重复项。
以下是修正后的代码,完全符合需求:
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] word = ['*', '*', 'd', '*', '*', 'm'] # 提取单词中已有的可见字母(后续要排除这些字母) existing_letters = set([c for c in word if c != '*']) # 记录所有非*字母的位置和字符 non_star = [(idx, c) for idx, c in enumerate(word) if c != '*'] final_letters = [] if not non_star: # 全是*的情况,所有字母都可填入 final_letters = letters.copy() elif '*' not in word: # 没有空位,返回空列表 final_letters = [] else: # 处理第一个非*字母左侧的*:允许填入小于该字母的字符 first_idx, first_c = non_star[0] if first_idx > 0: for c in letters: if c < first_c: final_letters.append(c) # 处理相邻非*字母之间的*:允许填入两者之间的字符 for i in range(len(non_star)-1): prev_c = non_star[i][1] next_c = non_star[i+1][1] prev_idx = non_star[i][0] next_idx = non_star[i+1][0] # 两个非*字母之间存在*才需要处理 if next_idx - prev_idx > 1: for c in letters: if prev_c < c < next_c: final_letters.append(c) # 处理最后一个非*字母右侧的*:允许填入大于该字母的字符 last_idx, last_c = non_star[-1] if last_idx < len(word)-1: for c in letters: if c > last_c: final_letters.append(c) # 排除已有的字母、去重并排序 final_letters = list(set(final_letters) - existing_letters) final_letters.sort() print(final_letters)
代码说明
- 提取已有字母:用集合存储单词中的可见字母,方便后续快速排除。
- 分场景处理:
- 全
*场景:直接返回完整字母表。 - 无
*场景:返回空列表(没有空位可填)。 - 混合场景:分别处理左侧、中间、右侧的有效区间,收集所有符合条件的字母。
- 全
- 去重与排序:通过集合去重,再排序保证结果有序。
运行示例输入,会输出:['a', 'b', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'],完全符合需求。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

