LeetCode 387 字符串中的第一个唯一字符 Swift 题解:用哈希表快速定位不重复字符 - 指南

news/2025/10/12 16:02:46/文章来源:https://www.cnblogs.com/wzzkaifa/p/19136740

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码拆解
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在日常开发中,处理字符串是最常见的任务之一。有时候我们需要从一段文字里找到某个“特殊”的字符,比如:

  • 在用户输入的用户名里,找到第一个唯一字符来生成推荐 ID;
  • 在聊天消息里快速定位第一个不重复的字母,做关键词标记;
  • 在日志文件里扫描异常标识符时,优先取第一个独特的符号。

这道题就是一个简化版的需求:给定一个字符串,找到第一个不重复的字符并返回它的下标,如果没有就返回 -1。

描述

题目要求:

举几个例子:

题解答案

最直观的想法:

  1. 我们需要知道每个字符出现了多少次。
  2. 再从左到右扫描一次,找到第一个只出现一次的字符。

这就很自然地联想到 哈希表(字典)来存储字符出现次数。

题解代码分析

下面是 Swift 实现:

import Foundation
class Solution {
func firstUniqChar(_ s: String) -> Int {
var frequency: [Character: Int] = [:]
// 第一次遍历:统计每个字符的出现次数
for ch in s {
frequency[ch, default: 0] += 1
}
// 第二次遍历:找到第一个出现次数为 1 的字符
for (index, ch) in s.enumerated() {
if frequency[ch] == 1 {
return index
}
}
return -1
}
}

代码拆解

  1. 统计字符出现次数

    • 用一个字典 frequency 存储每个字符出现的次数。
    • 遍历字符串时,frequency[ch, default: 0] += 1 是 Swift 的简洁写法,如果字典里没有该字符,就先设为 0。
  2. 寻找第一个唯一字符

    • 再次遍历字符串。
    • 如果某个字符在字典里的次数是 1,就直接返回它的索引。
  3. 不存在时返回 -1

    • 如果整串字符串都找不到唯一字符,就返回 -1

这个思路简单高效,只需要两次遍历。

示例测试及结果

我们写一个小 demo 来验证:

let solution = Solution()
let ex1 = "leetcode"
print("输入: \(ex1)")
print("输出: \(solution.firstUniqChar(ex1))\n")
let ex2 = "loveleetcode"
print("输入: \(ex2)")
print("输出: \(solution.firstUniqChar(ex2))\n")
let ex3 = "aabb"
print("输入: \(ex3)")
print("输出: \(solution.firstUniqChar(ex3))\n")

运行结果:

输入: leetcode
输出: 0
输入: loveleetcode
输出: 2
输入: aabb
输出: -1

完全符合题意。

时间复杂度

  • 第一次遍历统计次数 O(n)。
  • 第二次遍历查找唯一字符 O(n)。
  • 总体 O(n),满足要求。

空间复杂度

总结

这道题是典型的 哈希计数 + 遍历 问题,属于“快手题”,但在实际开发中也挺有用:

  • 处理用户输入时,快速找到独特标识;
  • 日志分析时定位第一个独特的关键字;
  • 文件名或标签扫描时,获取第一个唯一项。

它的思路非常清晰:

  • 先统计,再查找,一步步缩小问题。
  • 算法复杂度最优,额外空间需求也很低。

如果把题目升级,比如要求 返回所有唯一字符,思路也可以沿用,只是改成收集所有出现一次的字符。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:基于微信小程序的智能在线预约挂号系统【2026最新】

详细介绍:基于微信小程序的智能在线预约挂号系统【2026最新】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

2025中医师承权威推荐榜:名师带徒与临床实践深度解析

2025中医师承权威推荐榜:名师带徒与临床实践深度解析随着中医药事业的蓬勃发展,中医师承教育作为传统医学传承的重要方式,正受到越来越多从业者的关注。师承教育不仅延续了中医"传帮带"的优良传统,更通过…

让我们开始 CSS 的学习之旅

通过使用 HTML4.0,所有的格式化代码均可移出 HTML 文档,然后移入一个独立的样式表。 实例 HTML中的样式 (https://www.w3school.com.cn/tiy/t.asp?f=eg_html_style) 本例演示如何使用添加到 部分的样式信息对 HTML…

2025液压无损扒胎机厂家权威推荐榜:高效无损与耐用性能深度

2025液压无损扒胎机厂家权威推荐榜:高效无损与耐用性能深度在汽车维修与轮胎服务行业,液压无损扒胎机作为关键设备,其技术性能与耐用程度直接影响着作业效率和服务质量。随着2025年行业技术标准的提升,高效无损操作…

Linux环境下的UDEV机制及其与守护进程的关联

UDEV(用户空间设备管理器)是Linux内核的一部分,负责管理设备节点的创建和销毁。它是一个动态系统,用于处理内核发出的设备事件。当系统中添加或移除硬件时,UDEV负责在 /dev目录下创建或删除相应的节点。 在Linux启…

在Red Hat Enterprise Linux 9上使用Docker快速安装并部署

在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ,可以显著简化消息队列系统的搭建过程。以下是详细步骤,包括必要的命令和配置文件示例。 步骤一:安装Docker更新系统软件包 sudo dnf update -y安装…

[转] 基于ubuntu-base进行根文件系统的修改与打包

前言全局说明网络上的东西可能随时消失,转载备份,方便后来人需要查看原文网址:https://blog.csdn.net/sements/article/details/105240490对了,我最近开通了微信公众号,计划是两边会同步更新,并逐步的会将博客上…

jquery 字符串转数字

在JavaScript编程中,字符串到数字的转换是一项基础而重要的操作,尤其是在处理用户输入或执行数学运算的场景中。尽管jQuery主要聚焦于DOM操作和事件处理,但JavaScript原生提供的几个方法就能高效地完成这一转换任务…

AI圈每日技术学习---紧跟时代脚步(N8n工作流)

今天讲的是n8n工作流 n8n堪称目前最热门的工作流自动化工具之一,在GitHub上的Star数已达140k。它兼具强大功能与高度灵活性,通过基于节点的可视化编辑方式,让用户能够轻松连接各类应用与服务,快速实现自动化流程搭…

B -识别浮点常量问题

B - 识别浮点常量问题B - 识别浮点常量问题 Description编译器在对程序进行编译之前,首先要进行语法分析。通常,程序被分解成若干个小单元,然后和语言的语法模式进行匹配。在分析表达式的时候,变量的类型在变量声明…

小C语言--词法分析程序-A

小C语言--词法分析程序-A小C语言文法<程序>→<main关键字>(){<声明序列><语句序列>}<声明序列>→<声明序列><声明语句>|<声明语句>|<空><声明语句>→<…

查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量

MySQL 查看当前连接数 要查看当前MySQL服务器的活动连接数,可以使用以下SQL命令: SHOW STATUS LIKE Threads_connected; 这将返回当前打开的连接数。 配置最大连接量 在MySQL中,可以通过设置 max_connections系统变…

2025宿舍上下床厂家权威推荐榜:耐用设计与空间优化口碑之选

2025宿舍上下床厂家权威推荐榜:耐用设计与空间优化口碑之选行业背景分析随着教育事业的蓬勃发展和企业住宿需求的持续增长,宿舍家具市场迎来了新一轮的发展机遇。在众多宿舍家具品类中,上下床作为空间利用率最高的产…

IS-IS核心解析:驱动现代网络的隐形力量 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

梳理一下Java中为保证线程安全提供了那些方案 - 浪矢

目录同步机制 加锁synchronized 关键字Lock 接口原子操作类并发安全的集合类线程局部变量volatile关键字 同步机制 加锁 synchronized 关键字 对方法或代码块加锁(在JVM层面) 当我们使用synchronized时,Java虚拟机(…

处理Git错误:“invalid object [hash]”和“unable to read tree [hash]”

当在使用Git时遭遇“invalid object [hash]”或“unable to read tree [hash]”错误消息,通常表明Git在尝试读取不一致或损坏的数据时遇到了问题。这些错误可能由多种原因造成,包括但不限于磁盘错误、传输错误、文件…

2025厂房恒温恒湿设备厂家权威推荐榜:精准控温与节能技术深

2025厂房恒温恒湿设备厂家权威推荐榜:精准控温与节能技术深在工业制造领域,厂房环境的恒温恒湿控制已成为保障产品质量、提升生产效率的关键环节。随着2025年制造业升级步伐加快,企业对生产环境的要求日益严格,精密…

raspberry + pycharm failed

raspberry + pycharm failedroc@raspberrypi:~/Downloads $ tar -zxvf pycharm-2025.2.3-aarch64.tar.gz roc@raspberrypi:~/Downloads $ mv pycharm-2025.2.3 ../roc@raspberrypi:/usr/lib/jvm/java-17-openjdk-armhf…

面向对象编程实验一

1.实验任务一:**reverse和reverse_copy有什么区别?** 答:reverse和reverse_copy都是将一个容器里的元素倒置,区别在于前者是将倒置后的新序列依旧存储在原来的容器中,而后者是将倒置后的序列放在一个新的容器中,…

ABC 427 EF

E \(BFS\) 求最短路 需要注意到,所有垃圾是作为整体一起移动的,因此可能存在垃圾的所有区域一定是原图的某个子矩阵(子矩阵之外的其他区域至少有过一次出界,说明垃圾已被清除),只有 \(H^{2}W^{2}\) 种。而整张图…