Python|字符串中第二大的数字

Posted 算法与编程之美

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python|字符串中第二大的数字相关的知识,希望对你有一定的参考价值。

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

问题描述

给你一个混合字符串s,请你返回s中第二大的数字,如果不存在第二大的数字,请你返回-1。混合字符串由小写英文字母和数字组成。

示例:

输入:s = ‘dfa12321afd’

输出:2

解决方案

这是一道看似不难的题,但是实际操作会发现有很多难点,比如如何删除掉字符串中的混合英文字母,其次如何解决有重复数字出现的情况,再有如果不存在第二大数字的情况。

首先我们可以先遍历这个字符串,但是由于我们要进行删除排序等操作,所以要先把字符串转化为列表。因为我们是要进行遍历以及删除的,所以在遍历过程中如果原列表进行了改变,会导致错误的结果。所以我们要建立一个元素一样的列表,用来遍历,最后返回删除过的列表就可以了。然后我们要进行混合列表的筛选,通过对字符的ASCII码是否在字母的范围中来判断是否需要删除,将删除后的列表进行排序再取第二大的。其中有一个坑就是,如果有相同的数字则会返回错误答案,所以我们利用set可以查重的属性来查找第二大的数字。

代码及运行结果如下:

s = input(‘请输入字符串’)

c = list(s)

a = list(s)#做改变的

for i in s:

    if ord(i)>= 97 and  ord(i)<=122:

        a.remove(i)

    else:

        continue

 

if len(set(a))>1:

    print(int(sorted(set(a))[-2]))

else:

    print(-1)

另外一种比较快的操作方法就是,运用filter函数的筛选来过滤字母。isdigit()是一个内置,如果字符串只包含数字则返回True,否则返回False。但是这是字符串的内置,最后要返回的是数字,要用int函数改变一下形式。

s = 'sekfjis077'

digit = filter(str.isdigit, s)  # 过滤英文字母

ss = sorted(set(digit))

if len(ss) == 1 or len(ss) == 0:

        print(-1)

else:

    print(int(ss[-2]))

结语

这道题第二种方法运用了isdight()内置的方法,相比第一种用ASCII码的方法简单了很多,但是需要理解记忆并熟练运用。

实习编辑:衡辉

作者:窦钟灵、黄荟蓉、高钰婷

稿件来源:深度学习与文旅应用实验室(DLETA)

以上是关于Python|字符串中第二大的数字的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1796. 字符串中第二大的数字

LeetCode刷题简单-1796-字符串中第二大的数字

LeetCode刷题简单-1796-字符串中第二大的数字

LeetCode刷题简单-1796-字符串中第二大的数字

「 每日一练,快乐水题 」1796. 字符串中第二大的数字

「 每日一练,快乐水题 」1796. 字符串中第二大的数字