【Python3】【力扣题】387. 字符串中的第一个唯一字符

【力扣题】题目描述:

【Python3】代码:

1、解题思路:遍历字符串,依次判断元素在字符串中的个数是否为1,第一个为1的返回该元素的索引号,若整个字符串都没有个数为1的,则返回-1。

知识点:enumerate(序列):返回可迭代的序列中所有索引号和对应元素,元组形式 (索引, 元素)。

              序列.count(...):统计某元素在序列中的个数。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        for i,x in enumerate(s):
            if s.count(x) == 1:
                return i
        return -1

2、解题思路:使用计数器统计出字符串中所有元素及其个数,再次遍历字符串,依次判断元素在计数器中的个数是否为1,若是,返回索引,若整个字符串都没有个数为1的,则返回-1。

知识点:collections.Counter(...):计数器,字典子类。统计序列中元素及其出现个数。

              字典[键]:获取字典中键对应的值。或修改键对应的值:字典[键]=值。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        import collections
        adict = collections.Counter(s)
        for i,x in enumerate(s):
            if adict[x] == 1:
                return i
        return -1

3、(1)解题思路:使用字典统计出字符串中所有元素及其第一次出现的索引,若重复出现,则该元素在字典中对应的值为-1;再次遍历字典的所有值,在不是-1的值中找出最小的索引号,若没有,返回-1。

知识点:dict():创建空字典。即{ }。

              len(序列):获取序列的长度。

              字典.values():返回可迭代的字典中的所有值。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        adict = dict()
        n = len(s)
        for i,x in enumerate(s):
            if x in adict:
                adict[x] = -1
            else:
                adict[x] = i
        first = n
        for i in adict.values():
            if i != -1 and i < first:
                first = i
        if first == n:
            return -1
        return first

 (2)解题思路:使用字典统计出字符串中所有元素及其第一次出现的索引,若重复出现,则该元素在字典中对应的值为字符串总长度加索引(方便后面获取最小值);再次遍历字典的所有值,找出最小的索引号。

知识点:min(...):获取最小值。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        adict = dict()
        n = len(s)
        for i,x in enumerate(s):
            if x in adict:
                adict[x] = i + n
            else:
                adict[x] = i
        result = min(adict.values())
        return -1 if result > n else result

4、解题思路:使用字典统计出字符串中所有元素及其第一次出现的索引,若重复出现,则该元素在字典中对应的值为-1;使用队列依次以元组形式记录元素及其第一次出现的索引号,若是重复的元素从队列移除。最终队列为空,则返回-1,否则返回队列第一个元素中记录的索引号。

知识点:collections.deque():双端队列。左端进,右端出。也可以右端进,左端出。

              队列.append():从队尾(右端)添加一个元素。

              队列.popleft():从队头(左端)移除一个元素,并返回该元素。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        import collections
        adict = dict()
        n = len(s)
        q = collections.deque()
        for i,x in enumerate(s):
            if x not in adict:
                adict[x] = i
                q.append((s[i],i))
            else:
                adict[x] = -1
                while q and adict[q[0][0]] == -1:
                    q.popleft()
        return -1 if not q else q[0][-1]

5、解题思路:从字符串中依次筛选出所有出现次数为1的元素,列表形式记录,若空列表,则没有不重复的元素,返回-1,否则返回列表中第一个元素在字符串中对应的索引号。【该方法超出时间限制】

知识点:filter(predict, 可迭代对象):返回一个迭代器。筛选出所有符合条件的元素。

              lambda:匿名函数。

              序列.index(...):获取元素在序列中的索引号。

              序列[索引]:获取序列中索引号对应的元素。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 超出时间限制
        alist = list(filter(lambda x:s.count(x)==1,s))
        return -1 if len(alist)==0 else s.index(alist[0])

改进:遍历字符串,依次判断元素出现的次数是否为1,从字符串中过滤掉不满足条件的元素,获取第一个满足条件的元素及之后所有元素,列表形式记录,若空列表,则返回-1,否则返回列表中第一个元素在字符串中对应的索引号。

知识点:itertools.dropwhile(predict, 可迭代对象):返回一个迭代器。依次遍历可迭代对象,不满足条件的内容去除,第一个满足条件的内容及其之后所有内容全部返回。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        import itertools
        alist = list(itertools.dropwhile(lambda x:s.count(x)!=1, s))
        return -1 if len(alist)==0 else s.index(alist[0])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

武汉灰京文化:抓住用户心理,游戏推广不可或缺的前提

在当今激烈竞争的游戏市场中&#xff0c;了解目标用户成为游戏推广的不可或缺的前提。不同类型的游戏适合不同的用户群体&#xff0c;因此通过深入研究用户画像&#xff0c;准确定位目标用户群体&#xff0c;成为游戏成功推广的关键一环。游戏推广不仅仅是让更多的人知道游戏的…

运算符重载函数

C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键字operator后面接需要重载的运算符符…

机器学习-决策树

1、什么是决策树&#xff1f; 一种描述概念空间的有效的归纳推理办法。基于决策树的学习方法可以进行不相关的多概念学习&#xff0c;具有简单快捷的优势&#xff0c;已经在各个领域取得广泛应用。 决策树是一种树型结构&#xff0c;其中每个内部结点表示在一个属性上的测试&a…

大数据Doris(五十六):SQL函数之地理位置函数

文章目录 SQL函数之地理位置函数 一、​​​​​​​ST_AsText(GEOMETRY geo)

Java - Lombok的添加和使用详解

目录 &#x1f436;6.1 lombok介绍 &#x1f436;6.2 lombok使用 1. &#x1f959;添加方法一 2. &#x1f959;添加方法2 3. 使用 &#x1f436;6.3 lombok常用注解 1. &#x1f959;Getter和Setter 2. &#x1f959;ToString 3. &#x1f959;NoArgsConstructor和Al…

Docker入门安装、镜像与容器下载 —— 基本操作

目录 前言 Docker 1. docker介绍 2. docker安装 3. docker基本使用 3.1 镜像下载 3.2 操作容器 前言 虚拟机&#xff1a;基于主机(物理机或虚机)的多服务实例。在该模式下&#xff0c;软件开发人员可以提供单个或多个物理机或虚机&#xff0c;同时在每个主机上运行多个服…

【务实笔记】总要朝前看

最近关注了鱼皮的编程导航&#xff0c;打算跟着鱼皮做一做项目&#xff0c;为研究生复试作准备。其实我原先已经有一个C高并发服务器的项目了&#xff0c;只不过最近很无奈&#xff0c;开始打造前端页面的时候&#xff0c;虚拟机Qt安装界面死活卡在了第一步&#xff1a; ┭┮﹏…

Java多线程并发篇----第十七篇

系列文章目录 文章目录 系列文章目录前言一、为什么要用 join()方法?二、线程唤醒(notify)三、线程其他方法四、进程五、上下文前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享…

用Python实现USB插拔测试

测试目的 我司的产品需要进行唤与睡眠状态之间的切换测试&#xff0c;而且需要进行长时间的压力测试。由于没有插拔USB的机械设备&#xff0c;所以我这边就需要设计一个能模拟USB插拔的测试环境。 设计 测试环境的设计只能根据现有资源来进行&#xff0c;所以我这边给出的方…

Html+Css+JavaScript实现完整的轮播图功能

概要 这个案例具备常见轮播图完整的功能&#xff0c;大家可以根据自己的需求去修改&#xff1b; 代码可以直接复制运行&#xff0c;需要安装sass 主要功能&#xff1a; &#xff08;1&#xff09;鼠标移入轮播图&#xff0c;左右两边的按钮出现&#xff0c;离开则隐藏按钮&a…

【前后端的那些事】开源!treeSelect树形结构数据展示

文章目录 tree-selector1. 新增表单组件2. 在父组件中引用3. 父组件添加新增按钮4. 树形组件4.1 前端代码4.2 后端代码 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能&#xff0c;想写文章&#xff0c;录视频把这些内容记录下。但这些功能太零碎&#xff0c…

qemu、virt-manager克隆虚拟机

前提 必须先关闭虚拟机&#xff0c;不然克隆按钮是灰的&#xff0c;不能点击 克隆虚拟机 选择虚拟机--克隆 点击克隆 等待完成克隆 下图说明已经克隆成功 运行虚拟机

IntelliJ IDEA安装来了

IDEA 全称 IntelliJ IDEA&#xff0c;是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超…

接口interface--java学习笔记

认识接口 java提供了一个关键字interface&#xff0c;用这个关键字可以定义出一个特殊的结构&#xff1a;接口在接口里面定义的变量&#xff0c;不管加不加public static final修饰都默认为常量&#xff0c;必须赋初值在接口里面定义的方法&#xff0c;不管加不加public abstr…

Java 10_000 代表什么意思? 数字里面混夹着下划线?

先放一张图 &#xff0c;这到底是sleep了多久&#xff1f; public static void main(String[] args) {int a 10_000; System.out.println(a); // 10000} java 7 的 特性 &#xff1a;https://docs.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals…

SCSI/UFS储存 基础

一、UFS协议 UniPro 的上面就是 UTP 和 SCSI 命令集&#xff0c;由于涉及的 SCSI 命令是很大一块需要单独来讲&#xff0c;所以这里只简单两笔。正如最开始提到的&#xff0c;UTP 和 SCSI 是属于 SCSI 这部分&#xff0c;在 JEDEC 的标准里能找到它们的具体说明。 UTP&#xf…

第一篇:node的背景及版本的检查

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 前言 Node.js 是一个基于 Chrome V8 JavaScript 引擎…

如何使用Docker一键部署WBO白板并实现固定公网地址远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

机器学习算法实战案例:VMD-LSTM实现单变量多步光伏预测

文章目录 机器学习算法实战案例系列答疑&技术交流1 数据处理1.1 导入库文件1.2 导入数据集1.3 缺失值分析 2 VMD经验模态分解3 构造训练数据4 LSTM模型训练5 预测 机器学习算法实战案例系列 机器学习算法实战案例&#xff1a;确实可以封神了&#xff0c;时间序列预测算法最…

《MyBatis》-- 流式查询内存性能优化-单条数据加工

阿丹-需求/场景&#xff1a; 在项目场景中涉及到数据二次加工。需要将单个对象数据转为按照规定的数据字典的转换。以及需要转换数据结构。从对象转换为按照规定的值和规则的数组。 因为要写入csv文件&#xff0c;涉及到文件的输出流。 之前讨论针对的解决方案&#xff1a; …
最新文章