def f365(string):
new_st = ''
dict_string = dict(zip(list(string),[0]*(len(string))))
for each in string:
dict_string[each] += 1
#若字符串中一个元素出现的最大次数超过一半(奇数加一的一半,偶数的一半)则返回空字符串
if max(dict_string.values()) > ((len(string)+1)//2):
return new_st
#剩余的情况返回字符串
else:
#对字符串重新排序,依照元素频次高低对元素排列
i = 0
for each in dict_string:
j = dict_string[each]
if j > i:
#判定条件应为大于而不应该改是>=,不然会导致当连续出现相同较低频次时候,会使得这一低频次元素排列至最前端,如vvvbl--> lvvvb
while dict_string[each]:
new_st = each + new_st
dict_string[each] -= 1
else:
while dict_string[each]:
new_st = new_st + each
dict_string[each] -= 1
i = j
#将新排列的字符串平分为两部门[前半部分:后半部分],并将后半部分间隔插入前半部分字符串中
if len(string)%2 == 0:#偶数情况直接平分
st1 = new_st[:((len(string)+1)//2)]
st2 = new_st[((len(string)+1)//2):]
else:#考虑到map函数在此情况下两段字符串数量不一致(前半部分多一个元素)会少输出一组,人为引入一个元素
st1 = new_st[:((len(string)+1)//2)]
st2 = new_st[((len(string)+1)//2):] + 'X'
st_l = list(map(lambda i,j: i+j, st1, st2))
if len(string)%2 == 0:
return ''.join(st_l)#偶数情况直接得到真值
else:
return ''.join(st_l)[:-1]#将引入的元素去除,返回真值
将之前的第十三行代码删除(冗余),第十九行代码 i>=j的判定条件改为i>j
|