|
发表于 2020-4-2 20:27:35
|
显示全部楼层
- 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
|
评分
-
查看全部评分
|