题解 | #找出字符串中第一个只出现一次的字符#

找出字符串中第一个只出现一次的字符

http://www.nowcoder.com/practice/e896d0f82f1246a3aa7b232ce38029d4

题目分析

  1. 题目给出我们若干个字符串
  2. 我们要输出每个字符串中,只出现一次的而且是最先只出现一次的字符,如果没有的话则输出-1

方法一:哈希存储

  • 实现思路
    • 通过一个字典存储所有字符出现的次数

    • 然后按照字符串顺序遍历(可优化)

    • 找到字符串顺序中,第一个只出现一次的字符

    • 输出目标字符

    • 如果找不到则输出-1


import collections

def solution(s):
    d = collections.defaultdict(int)        # 默认字典计数
    for c in s:
        d[c] += 1                           # 统计所有字符出现的次数
    for c in s:
        if d[c] == 1:                       # 按照字符串顺序遍历字符,查看是否只出现一次
            return c
    return -1

while True:
    try:
        s = input()
        print(solution(s))
    except:
        break

复杂度分析

  • 时间复杂度:O(n)O(n),遍历字符串的时间开销
  • 空间复杂度:O(n)O(n),字典所花费的空间开销

方法二:哈希存储+优化

  • 实现思路
    • 对于方法一中,如果有用例"aaaaaaab",我们就需要花很长的时间来遍历字符串直到锁定字符b才是第一次出现的只出现一次的字符
    • 因此我们再用一个seq的列表,存储字母出现过的顺序
    • 只要在一开始第一轮遍历字符串统计出现次数的时候,同时将没有见到过的字符装到seq中,我们就可以构造一个字符出现顺序的列表
    • 之后只要遍历顺序列表就可以更快锁定结果

alt

import collections

def solution(s):
    d = collections.defaultdict(int)        # 默认字典计数
    seq = list()                            # 记录字符出现顺序的列表
    for c in s:                             # 遍历给定字符串
        if c not in d:                      # 如果c没有在d中出现,此时字符c就是第一次出现的时刻
            seq.append(c)                   # 添加到顺序列表中
        d[c] += 1                           # 统计所有字符出现的次数

    for c in seq:                           # 遍历顺序列表,可以避免诸如用例"aaaaaaaab"类型的时间开销
        if d[c] == 1:                       # 按照字符串顺序遍历字符,查看是否只出现一次
            return c
    return -1

while True:
    try:
        s = input()
        print(solution(s))
    except:
        break

复杂度分析

  • 时间复杂度:O(n)O(n),遍历字符串的时间开销
  • 空间复杂度:O(n)O(n),字典和列表所花费的空间开销
全部评论

相关推荐

点赞 评论 收藏
分享
09-27 00:29
东北大学 Java
伟大的麻辣烫:查看图片
阿里巴巴稳定性 75人发布 投递阿里巴巴等公司10个岗位
点赞 评论 收藏
分享
11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务