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

Python代码无法正确返回字符串首个非重复字符的问题排查

问题分析与解决方案

你的代码核心错误在于:res数组仅记录了所有首次出现的字符,但没有剔除后续发现重复的字符。比如输入"abacabad"时,第一个字符'a'被加入res,但后续它重复出现多次,属于重复字符,不应被留在结果集中,但你的代码仍返回res[0],导致输出错误。

修正方案一:先统计频率,再按原顺序查找(推荐)

先遍历一次字符串统计所有字符的出现频率,再按原字符串顺序遍历,找到第一个频率为1的字符。这种方法时间复杂度为O(n),空间复杂度为O(1)(因为小写字母最多26种),效率最高。

class Solution(object):
    def nonrepeating(self, 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
        # 无符合条件字符时返回-1
        return -1

修正方案二:遍历中维护结果集

在遍历字符串时,不仅统计频率,还维护res数组:首次出现时加入,重复出现时从res中移除(需判断是否存在,避免重复移除)。这种方法逻辑直观,但数组移除操作的时间复杂度较高,适合短字符串场景。

class Solution(object):
    def nonrepeating(self, s):
        char_count = {}
        res = []
        for char in s:
            count = char_count.get(char, 0) + 1
            char_count[char] = count
            if count == 1:
                res.append(char)
            else:
                if char in res:
                    res.remove(char)
        return res[0] if res else -1

验证输入"abacabad"

使用方案一时,统计后'a'出现4次,'b'出现2次,'c'和'd'各出现1次。按原字符串顺序遍历,第一个频率为1的字符是'c',符合预期输出。

内容的提问来源于stack exchange,提问作者vilnius19

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:45:19