← 返回编程题库
coding-first-unique-character简单免费版2000ms未尝试

第一个唯一字符

First Unique Character

开始编码

做交易系统排查的工程师在回看早盘订单流时,常常要做一个“最早唯一事件”的小探针——找出某条流里第一个整段窗口内只出现过一次的标识(trade ID、venue tag、session 标志)所在的位置。它的字符串版就是这道经典热身题:给定字符串 s,返回**第一个在 s 中只出现一次的字符**的位置。同样的“两遍扫 + 计数”模式在微观结构工具里反复出现——磁带回放里的首个唯一 trade ID、整个交易日里只路由过一次的 venue、点击流里的异常标志——把这个最干净的写法练扎实是值得的。

请实现 solution(s: str) -> int。扫描 s,返回**第一个在整段 s 中只出现一次的字符的 0 基索引**。若每个字符都重复了(或 s 为空),返回 -1。比较区分大小写。

举例:solution("leetcode") 返回 0,因为 l 是第一个只出现一次的字符。solution("loveleetcode") 返回 2,因为 lo 都重复,索引 2 处的 v 才是第一个仅出现一次的字符。solution("aabb") 返回 -1,每个字符都重复了。solution("") 同样返回 -1

参考解法是两次线性扫:第一遍用哈希表统计每个字符的出现次数;第二遍按索引顺序扫描,遇到计数为 1 的字符就返回它的索引。时间复杂度 O(n),额外空间 O(k),其中 k 是字符集大小(ASCII 最多 128)。朴素做法——对每个位置都再扫一遍剩下的字符判定唯一性——是 O(n²),在 n=10^5 时会超时。

约束条件

  • 0 ≤ len(s) ≤ 10^5
  • `s` 是任意可打印 ASCII 字符串(一般是小写字母,但大写字母、数字、空格、符号也都合法)
  • 比较区分大小写:`'A'` 与 `'a'` 是两个不同的字符
  • 返回第一个仅出现一次的字符的 **0 基索引**;若不存在(包括 `s` 为空时),返回 `-1`

样例

Case 1 · example from statement (leetcode classic)

输入: ["leetcode"]

期望: 0

字符 `l` 只出现一次,且它是第一个仅出现一次的字符(位于索引 0),返回 0。

Case 2 · example with leading repeats

输入: ["loveleetcode"]

期望: 2

`l` 与 `o` 都重复出现,索引 2 处的 `v` 是第一个仅出现一次的字符。

Case 3 · all repeated returns -1

输入: ["aabb"]

期望: -1

每个字符都至少出现两次,没有“唯一字符”,返回 -1。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · example from statement (leetcode classic)

输入: ["leetcode"]

期望: 0

字符 `l` 只出现一次,且它是第一个仅出现一次的字符(位于索引 0),返回 0。

Case 2 · example with leading repeats

输入: ["loveleetcode"]

期望: 2

`l` 与 `o` 都重复出现,索引 2 处的 `v` 是第一个仅出现一次的字符。

Case 3 · all repeated returns -1

输入: ["aabb"]

期望: -1

每个字符都至少出现两次,没有“唯一字符”,返回 -1。