You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]):

但仍遇到类似问题。


核心错误点

  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'的事实。
  2. 返回值错误:
    代码中返回的是(i, el)元组,但题目要求返回的是字符本身,应该直接返回el。

  3. 代码缩进错误:
    函数内部的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:31:03