CodeSignal firstNotRepeatingCharacter问题:多条件elif失效排查
解决firstNotRepeatingCharacter问题时的逻辑错误分析与修复
我在解决firstNotRepeatingCharacter问题时遇到了问题,需求是返回给定字符串中第一个不重复的字符,但我的Python代码未得到预期结果。
测试用例:输入字符串'habahzb',预期输出为'z',但实际输出为'a'。
我的代码如下:
def solution(s): # 遍历所有元素 for i,el in enumerate(s): # 用于调试查看状态 #print(i,el,s[i+1:], s[i-1::-1]) # 如果是第一个元素,仅检查后面的字符是否有重复 # 无重复则返回该元素 if i == 0: if el not in s[i+1:]: return i,el # 如果不是第一个元素,检查前后字符是否有重复 # 无重复则返回该元素 elif el not in ( s[i+1:] or s[i-1::-1] ): return i,el # 否则返回'_' return '_' s='habahzb' solution(s)
我尝试修改条件为:
elif (el not in s[i+1:]) or (el not in s[i-1::-1]):
但仍遇到类似问题。
核心错误点
逻辑判断错误:
- 原条件
el not in (s[i+1:] or s[i-1::-1])完全不符合需求。Python中A or B会返回第一个非空的对象,所以这个条件等价于仅检查el是否在s[i+1:]中(只要s[i+1:]非空),完全忽略了前面的字符是否重复。 - 修改后的
(el not in s[i+1:]) or (el not in s[i-1::-1])逻辑依然错误:这个条件只要满足“后面没有重复”或者“前面没有重复”就返回,而我们需要的是前后都没有重复(即该字符在整个字符串中只出现一次)。比如输入中的'a'在索引1的位置,前面没有'a',所以el not in s[i-1::-1]为True,条件成立,导致提前返回'a',而忽略了后面还有'a'的事实。
- 原条件
返回值错误:
代码中返回的是(i, el)元组,但题目要求返回的是字符本身,应该直接返回el。代码缩进错误:
函数内部的s='habahzb'和solution(s)缩进错误,应该放在函数定义之外,否则无法正确调用测试。
正确解决方案
思路1:统计字符出现次数(高效简洁)
先统计每个字符在字符串中的出现次数,再遍历原字符串,找到第一个出现次数为1的字符。
from collections import Counter def solution(s): char_count = Counter(s) for char in s: if char_count[char] == 1: return char return '_' s = 'habahzb' print(solution(s)) # 输出 'z'
思路2:不使用额外库(手动检查)
遍历每个字符,检查它在整个字符串中的出现次数是否为1:
def solution(s): for char in s: if s.count(char) == 1: return char return '_' s = 'habahzb' print(solution(s)) # 输出 'z'
思路3:优化手动检查(减少重复计算)
如果字符串很长,s.count(char)会重复遍历字符串,效率较低。可以先遍历一次记录每个字符的出现次数,再遍历一次找第一个次数为1的字符:
def solution(s): char_count = {} for char in s: char_count[char] = char_count.get(char, 0) + 1 for char in s: if char_count[char] == 1: return char return '_' s = 'habahzb' print(solution(s)) # 输出 'z'
内容的提问来源于stack exchange,提问作者Maruf Talukdar
相关产品推荐
相关产品推荐

