<LeetCode天梯>Day017 字符串中的第一个唯一字符(哈希表+find&rfind) | 初级算法 | Python

简介: <LeetCode天梯>Day017 字符串中的第一个唯一字符(哈希表+find&rfind) | 初级算法 | Python

以下为我的天梯积分规则:


每日至少一题:一题积分+10分

若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)

若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)


初始分为100分

若差一天没做题,则扣积分-10分(周六、周日除外注:休息)

坚持!!!


初级算法

刷题目录

字符串


image.png

image.png

题干

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。


示例:


s = “leetcode”

返回 0


s = “loveleetcode”

返回 2


提示:你可以假定该字符串只包含小写字母。


哈希表

分析:


本题找到不重复的字符,很明显的暗示,让我们用字典,哈希表来解题。通过字典确定每个字符的个数,然后再选出只有单次出现的字符,且选出最先出现的,返回其相对应的索引号。

class Solution:
    def firstUniqChar(self, s: str) -> int:
    # 哈希表
        hashmap = {}
        for i in s:
            if i not in hashmap:
                hashmap.update({i:s.count(i)}) # 将数字各自出现的个数存入哈希表中
        for key,value in hashmap.items():   # 遍历哈希表的键值
            if hashmap[key] == 1:
                return s.index(key)
        return -1

哈希表的速度表现还不错的!~

image.png

索引count

分析:

我们还可以将字符串取为单个字符成list后,通过count计数,看在其中的个数是多少,遍历所有项,删除多余的项,若大于1,则不返回;若仅有一个字符,则返回其对应的索引号。若不存在,则返回-1.

class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 将s中的单个字母取出来为单个字符串
        list1 = list(map(str, s))
        n = len(list1)
    temp = 0
        list2 = list(map(str, s))
        for i in list1:
            if list1.count(i) > 1:
                list2.remove(i)   # 如果有,则删除list2里的对应值
        # 判断是否存在上述情况
        for j in list1:
            if list1.count(j) == 1:
                temp += 1
        if temp > 0:
            return list1.index(list2[0])   # 查询list2中删除完
        return -1

额,勇气可嘉,超出时间限制了,感觉不应该的啊

image.png

我们再进行优化一下

将temp的判断再细化一下

不遍历所有直接读取list2的参数,看是否删除了相同的值之后还存在值,如果还有则,返回第一个,如果没有,则返回-1。

class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 将s中的单个字母取出来为单个字符串
        list1 = list(map(str, s))
        n = len(list1)
    list2 = list(map(str, s))
        for i in list1:
            if list1.count(i) > 1:
                list2.remove(i)   # 如果有,则删除list2里的对应值
        # 判断是否存在上述情况
        if len(list2) > 0:
            return list1.index(list2[0])   # 查询list2中删除完
        return -1

还是太菜了,超出时间限制了

image.png

不过肯定是能用的。

咱们只用内置函数试试

class Solution:
    def firstUniqChar(self, s: str) -> int:
    for i in range(len(s)):
            if s.count(s[i]) == 1:
                return i
        return -1

image.png

实时证明,确实很慢很慢,不考虑了。

两次遍历

我们可以使用两次遍历来输出,第一次遍历,将每个数字出现的次数保存在一个list中,第二次遍历这个list,如果一遇到值为1,则输出1所在的索引值,否则,返回-1.

class Solution:
    def firstUniqChar(self, s: str) -> int:
    c1 = []
        n = len(s)
        for i in range(n):
            c1.append(s.count(s[i]))
        for j in range(n):
            if c1[j] == 1:
                return j
        return -1

勇气可嘉,怎么还是超出时间限制啊o(╥﹏╥)o

image.png

find和rfind

此法骨骼极其清奇,简直不要太妙了。一个从前查找,一个从后查找,如果下标相等,说明只出现了一次

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

image.png


相关文章
|
3月前
|
Python
Python中的f-string:更优雅的字符串格式化
Python中的f-string:更优雅的字符串格式化
335 100
|
3月前
|
开发者 Python
Python中的f-string:高效字符串格式化的利器
Python中的f-string:高效字符串格式化的利器
453 99
|
3月前
|
Python
Python中的f-string:更优雅的字符串格式化
Python中的f-string:更优雅的字符串格式化
|
3月前
|
开发者 Python
Python f-strings:更优雅的字符串格式化技巧
Python f-strings:更优雅的字符串格式化技巧
|
2月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
170 4
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
233 0
|
2月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
175 2
|
3月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
215 3
|
2月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
164 8

热门文章

最新文章

推荐镜像

更多