例如。如果我们有两个字符串2和10,如果我们按字典顺序排序,则10将首先出现。
非常简单的解决方案是重复一个角色n。
eg. 2 can be encoded as aa
10 as aaaaaaaaaa
This way the lex order is same as the numeric one.
但是,有更优雅的方法吗?
答案 0 :(得分:6)
将数字转换为字符串时,请确保所有字符串具有相同的长度,如果需要,可在前面添加0。所以2和10将被编码为" 02"和" 10"。
答案 1 :(得分:3)
虽然kjampani的解决方案在正常应用程序中可能是最好和最简单的,但另一种节省空间的方法是在每个字符串前面加上自己的长度。当然,您需要以一致的方式对长度进行编码。
如果您知道所有字符串都很短,您可以将它们的长度编码为固定长度的基数X序列,其中X是您愿意使用的字符代码的数量(流行值为64,96 ,255和256.)请注意,您必须按字典顺序使用字符代码,因此普通的base64将无效。
一个可变长度顺序保留编码是UTF-8使用的编码。 (不是直接使用UTF-8,它有一些角落情况会妨碍,但是相同的编码技术.UTF-8的顺序保留属性偶尔会非常有用。)这种压缩代码的全部范围都可以编码长度最多为42位的值,每个字节平均有5个有效负载位。这对于相当长的琴弦来说足够了;四条TB的长弦在野外非常罕见;但是如果你需要更长的时间,也可以通过将大小前缀扩展到多个字节来实现。
答案 2 :(得分:-1)
将字符串分成连续的字母和数字子字符串,然后通过将每个子字符串作为整数进行排序(如果它是数字字符串)
“aaa2”---> aaa + 2
“aaa1000”---> aaa + 1000
aaa == aaa
由于它们是平等的,我们继续:
1000> 2
因此,aaa1000> aaa2。