第一个只出现一次的字符(HJ13)

第一个只出现一次的字符

题目描述

https://www.nowcoder.com/share/jump/5832603751775720154472

给定一个字符串,找出其中第一个只出现一次的字符。如果没有这样的字符,输出 -1。

示例

输入:

asdfasdfo
输出:
o
解释:o 只出现 1 次,且是第一个满足条件的字符

输入:

aabbcc
输出:
-1
解释:所有字符都出现多次

解题思路

哈希表统计 + 顺序查找

  1. 使用 Counter 统计每个字符的出现次数
  2. 按原字符串顺序遍历,找到第一个计数为 1 的字符
  3. 若遍历完未找到,返回 -1

关键点:必须遍历原字符串而非字典,保证找到的是”第一个”符合条件的字符。

代码实现

from collections import Counter

s = input().strip()
cnt = Counter(s)

for ch in s:
    if cnt[ch] == 1:
        print(ch)
        exit()

print(-1)

代码解析

Counter(s) - 字符频率统计

Counter("asdfasdfo")
# → Counter({'a': 2, 's': 2, 'd': 2, 'f': 2, 'o': 1})

遍历原字符串保证顺序

for ch in s:          # 按原顺序遍历
    if cnt[ch] == 1:  # 第一个计数为1的即为答案
        print(ch)
        exit()        # 找到后立即退出

为什么不能遍历 cnt.keys()

# cnt.keys() 的顺序是随机的(Python 3.7+ 字典保持插入顺序,但Counter的顺序不保证对应原字符串)
for ch in cnt:  # ❌ 错误:无法保证是原字符串中的"第一个"
    if cnt[ch] == 1:
        print(ch)

exit() - 提前退出程序

找到答案后立即退出,避免继续无效遍历。

时间复杂度

  • O(n) - Counter 统计 O(n),顺序查找 O(n)

空间复杂度

  • O(k) - 存储字符频率,k 为字符种类数

第一个只出现一次的字符(HJ13)
https://mingsm17518.github.io/2026/04/09/algorithm/华为机考/nowcoder/String/13_first_unique_char/
作者
Ming
发布于
2026年4月9日
更新于
2026年4月9日
许可协议