问题陈述: 我在Java中使用String形式的非负数数组,我想安排整数以形成最大可能数。
示例:在下面的输入中给出:
label
排列“ 9623415”给出的数字最多。
注意:我了解我们可以按降序对所有数字进行排序,但无法进行排序。例如,自然顺序中的15大于9,但是在解决方案中“ 9”在“ 15”之前。在这种情况下,实现自定义比较器的最佳方法是什么?
任何帮助将不胜感激。
答案 0 :(得分:-1)
您需要的是public int compareTo(String anotherString)
的方法String
,该方法按字典顺序给您提供字符串的顺序。
更新1: 什么是字典顺序。
Frome Java Doc:
这是字典顺序的定义。如果两个字符串不同,则它们要么在某个索引处具有不同的字符(这是两个字符串的有效索引),要么它们的长度不同,或者两者都存在。如果它们在一个或多个索引位置具有不同的字符,则令k为最小索引;那么,在字符串位置k处的字符具有较小值(通过使用<运算符确定)的字符串,按字典顺序在另一个字符串之前。在这种情况下,compareTo返回两个字符串中位置k处两个字符值的差,即值:
this.charAt(k)-anotherString.charAt(k)
如果没有索引位置在它们之间有所不同,则较短的字符串按字典顺序在较长的字符串之前。在这种情况下,compareTo返回字符串长度的差-即值:
this.length()-anotherString.length()
因此,字符串9
将按字典顺序出现在字符串15
的前面,因为它们在索引0
处具有不同的字符,并且字符9
大于字符{ {1}}。如果仔细阅读了词典顺序,您会发现该顺序正是OP所需要的!
Update2:为什么按字典顺序排序是解决此问题的关键
问题中字符串的字典顺序如下:
1
因此,在获得此顺序后,问题应该很简单:只需迭代顺序即可,然后得到答案。
更新3:如何处理类似"9", "62", "34","15"
这样的特殊情况,因为我们需要"9"&"90"
而不是"990"
在这种情况下,字典顺序将失败。但是很容易找出解决办法:
我们可以使用"909"
代替str1.compareTo(str2)
。此处的关键是确保这两个字符串至少具有一些不同的数字,因此我们不能通过比较那里的长度来获得顺序。