python3实现在一个字符串中找到第一个只出现一次的字符

这道题是剑指offer中的35题,也是一道经典的面试题。

str = "ssssaaaccddsadasf"

使用两层for循环遍历,直到遇到只出现一次的字符返回该字符

def methond1(str):
    len_str = len(str)
    for i in range(len_str):
        count = 0
        for j in range(len_str):
            if str[j] == str[i]:
                count += 1
        if count == 1:
            return str[i]

使用一层for循环,统计某字符出现的所有次数,并按其出现的先后顺序记录在列表中

def methond2(str):
    counts = {}
    order = []
    for s in str:
        if s in counts:
            counts[s] +=1
        else:
            counts[s] = 1
            order.append(s)
    for i in order:
        if counts[i] == 1:
            return i

同一种方法的另外一种写法

def FirstNotRepeatingChar(self, s):
    dict = {}
    for ele in s:
        dict[ele] = 1 if ele not in dict else dict[ele] + 1
    for i in range(len(s)):
        if dict[s[i]] == 1:
            return i
    return -1

使用内置的count 函数

def methond3(str):
    for s in str:
        if str.count(s) == 1:
            return s,str.index(s)

如果将这个问题进行扩展,可扩展为:在一个字符串中找到第一个只出现N次的字符,假设N=2

只需将上方的代码做稍微的改动即可

def methond1_n(str):
    len_str = len(str)
    for i in range(len_str):
        count = 0
        for j in range(len_str):
            if str[j] == str[i]:
                count += 1
        if count == 2:
            return str[i]

def methond2_n(str):
    counts = {}
    order = []
    for s in str:
        if s in counts:
            counts[s] +=1
        else:
            counts[s] = 1
            order.append(s)
    for i in order:
        if counts[i] == 2:
            return i

def methond3_n(str):
    for s in str:
        if str.count(s) == 2:
            return s

若将其做进一步的扩展:在一个字符串中找到第M个只出现N次的字符,假设M=3 N=2

def methond1_mn(str):
    for i in range(len(str)):
        count = 0
        m = 0
        for j in range(len(str)):
            if str[i] == str[j]:
                count += 1
            if count == 2:
                if m == 2:
                    return str[i]
                else:
                    m+=1

 

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值