题目:
输入一串字符串,类似a2as2f5,都是字母串挨着数字这样的组合。
其中数字表示前面这个字母串重复的次数。比如a2表示aa,ad2表示adad
先用数字对这个字符串排序,如果数字相同,就按字符串的ascii码升序排序。
类似:
a2b2c1
排完的结果:
caabb
注意:原题目的样例有点问题,上面的样例是我写的。
方法1:
思路:不用正则,不用内置排序,所有函数手写的效果。
先把字符串里所有的字符和数字用临时字符串存储为List,
然后对List快排,先按频度排,频度相等按ascii码排
inputs=input()
'''
判断输入是不是字母,是返回true否则false。
也可以直接用函数
str.isdigit():判断str是否数字
str.isalpha():判断str是否为字母
'''
def isChar(inputs):
if(inputs <= '9' and inputs>='0'):
return False
else:
return True
#在快排的key也就是频率判断相等时,再加一层字符串ascii码的比较判断
def quicksort(alist):
if(len(alist)<=1):
return alist
key=alist.pop(0)
left=[]
right=[]
for i in range(len(alist)):
if(alist[i][0]>key[0]):
right.append(alist[i])
elif(alist[i][0]==key[0]):
if(alist[i][1]>key[1]):
right.append(alist[i])
else:
left.append(alist[i])
else:
left.append(alist[i])
return quicksort(left)+[key]+quicksort(right)
#建立list存储 [频度数字 :字母],如果要建字典,因为字典的键不能重复,所以
alist=[]
#临时变量,标志上一个变量是字母True还是数字False
preFlag=True
#存储临时字母字符串
tstr=''
#存储临时数字字符串
nstr=''
for i in range(len(inputs)):
# 标志,记录当前字符是字母,是返回True,否返回False
flag=isChar(inputs[i])
##当前是字母flag=True
if(flag):
# 上一个是字母,字母加入临时字符串
if(flag==preFlag):
tstr=tstr+inputs[i]
# 上一个是数字,新的键值对的开头,将上一个键值对加入dic,清空临时字符串,临时字母串加入字符串
else:
alist.append([int(nstr),tstr])
nstr = ''
tstr = ''
tstr=tstr+inputs[i]
preFlag = True
# 当前是数字 flag=False
else:
# 上一个也是数字,数字加入临时数字字符串
if(flag==preFlag):
nstr=nstr+inputs[i]
# 上一个是字母,清空临时数字字符串,将当前数字加入字符串。
else:
nstr = ''
nstr=nstr+inputs[i]
preFlag=False
#注意,最后一个组合在循环部分不会添加到List,要额外加入
alist.append([int(nstr),tstr])
#对list快排,先排频度,频度相等排字符串ascii码
rstr=quicksort(alist)
rs=''
for item in rstr:
rs=rs+item[1]*int(item[0])
print(rs)
方法2:
简化代码,
import re
re.findall(pattern, string, flags=0)
用正则来处理字符串,按pattern模式 字母+数字 来将字符串切割成List。
利用sort的内置的参数进行复合排序,
sorted(iterable[, key][, reverse])
list.sort(*, key=None, reverse=None)
参数说明:
key是带一个参数的函数,返回一个值用来排序,默认为 None。
reverse表示排序结果是否反转
key=itemgetter()可以用来对阈值进行排序,可以输入多个阈值。
比如key=itemgetter(1,2),会先按第1列的结果排序,如果1列排的时候值相等,就按
第2列的结果进行排序。
students= [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]
sorted(students,key=lambda student : student[2]) # sortby age
#out:[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
sorted(students,key=itemgetter(2)) # sort by age
#out:[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
sorted(students,key=itemgetter(1,2)) # sort by gradethen by age
#out:[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
代码2:
a1bb2
第一个正则会得到 [‘a’,’bb’]
第二个正则[‘1’,’2’]
然后拼成一个List,[[‘1’,’a’],[‘2’,’bb’]]
利用sorted()复合排序,先按0列排,再按列排。默认排序都是升序。ascii码也是升序的。刚好满足题意。语法糖写笔试的时候用会很快,但是面试的时候用会被人质疑,所以语法糖要会,语法糖的原理也要懂。
import operator
import re
inputs=inputs()
charlist=re.findall(r"[a-z]+",inputs)
numlist=re.findall(r"[0-9]+",inputs)
alist=[]
for i in range(len(charlist)):
alist.append([numlist[i],charlist[i]])
rstr=sorted(alist,key=operator.itemgetter(0,1))
rs=''
for item in rstr:
rs=rs+item[1]*int(item[0])
print(rs)