问题描述
给你一个混合字符串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码的方法简单了很多,但是需要理解记忆并熟练运用。