华为2019校招笔试(9月5号)3 字符串排序:先按频率排再按字符串ascii码排

题目:
输入一串字符串,类似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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值