我一直在尝试解决这个面试问题,该问题要求对字符串进行洗牌,以便没有两个相邻的字母是相同的
例如,
ABCC -> ACBC
我想到的方法是
1)迭代输入字符串并存储(字母,频率)
配对some收藏
2)现在通过拉出我们刚才没有拉出的最高频率(即> 0)字母来构建结果字符串
3)每当我们提取字母时更新(减少)频率
4)如果所有字母的频率为零,则返回结果字符串
5) 如果只剩下一个频率大于 1 的字母,则返回错误
通过这种方法,我们可以将更珍贵(不太频繁)的信件留到最后。但为了实现这一点,我们需要一个集合,它可以让我们有效地查询键,同时有效地按值对其进行排序。就像是this https://stackoverflow.com/questions/289/how-do-you-sort-a-dictionary-by-value可行,除非我们需要在每次字母检索后对集合进行排序。
我假设是 Unicode 字符。
关于使用什么集合有什么想法吗?或者另一种方法?
您可以按频率对字母进行排序,将排序后的列表分成两半,然后依次从两半中取出字母来构建输出。这需要一次排序。
例子:
- 初始字符串:
ACABBACAB
- Sort:
AAAABBBCC
- Split:
AAAA
+BBBCC
- 结合:
ABABABCAC
如果出现频率最高的字母数量超过字符串长度的一半,则该问题无解。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)