【问题标题】:How to find the largest possible number given an array of non-negative numbers in Java [duplicate]给定Java中的非负数数组,如何找到最大可能数[重复]
【发布时间】:2019-05-16 07:08:36
【问题描述】:

问题陈述: 我在 Java 中有一个字符串形式的非负数数组,我想排列整数以形成最大可能的数字。

示例:给出以下输入:

String[] numbers = {"15", "9", "62", "34"};

排列“9623415”给出了最大的数字。

注意:我知道我们可以按降序对所有数字进行排序,但简单的排序是行不通的。例如,15 按自然顺序大于 9,但在解决方案中“9”排在“15”之前。在这种情况下,实现自定义比较器的最佳方式是什么?

任何帮助将不胜感激。

【问题讨论】:

  • 把它们变成字符串,然后排序,然后连接。
  • @Thilo 它们已经是字符串,这使它变得微不足道...
  • 基本上,Arrays.stream(numbers).sorted().collect(Collectors.joining(""))
  • 在您的比较器中,您需要根据应该足以解决此问题的第一个数字/字符进行比较。 public int compare(String s1,String s2){ return (s1.charAt(0)-s2.charAt(0));让我们在这里举同样的例子——我们有“15”、“9”、“62”、“34”,现在根据数组元素的第一个数字对这个字符串进行排序,那么顺序将是 9> 6>3>1现在根据上面提到的第一个字符串以相同的顺序排列字符串 - “9”,“62”,“34”,“15”,最后,附加将成为您的结果的字符串。
  • @Kanahaiya:下次发个答案就行了。

标签: java arrays algorithm sorting


【解决方案1】:

String 的方法 public int compareTo(String anotherString) 是您需要的,它为您提供 字典顺序 的字符串顺序。

更新1: 什么是字典序。

来自 Java 文档:

这是字典顺序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,或者它们的长度不同,或两者兼而有之。如果它们在一个或多个索引位置具有不同的字符,则设 k 为此类索引中的最小;然后,在位置 k 处的字符具有较小值的字符串(通过使用

this.charAt(k)-anotherString.charAt(k)

如果它们没有不同的索引位置,则较短的字符串按字典顺序排列在较长的字符串之前。在这种情况下, compareTo 返回字符串长度的差值——也就是值:

this.length()-anotherString.length()

所以字符串9在字典顺序中将出现在字符串15之前,因为它们在索引0处有不同的字符,并且char9大于char1。如果您仔细阅读字典顺序,您会发现该顺序正是 OP 所需要的!

更新2:为什么字典顺序是这个问题的关键

问题中字符串的字典顺序是这样的:

"9", "62", "34","15"

所以在你得到这个顺序之后,问题应该很简单:只需迭代有序序列,你就会得到答案。

更新 3: 如何处理特殊情况,例如:"9"&"90",因为我们需要 "990" 而不是 "909"

在这种情况下,词典排序将失败。但很容易找到解决办法:

我们可以使用(str2+str1).compareTo(str1+str2),而不是str1.compareTo(str2)。这里的关键是确保这两个字符串至少有一点不同的数字,所以我们不能通过比较长度来得到顺序。

【讨论】:

  • 为什么投反对票?这个问题完全是关于字符串如何排序的误解,这个答案解决了这个问题。
  • 不是,不是。这并没有解释什么是“词典”顺序,或者为什么它解决了 OP 对最终如何排序的主要担忧。你可能正确,但你需要做更多来说服他们。
  • 好的,我会发布一个详细的更新..
  • 这里有一个额外的转折,但是,请参阅stackoverflow.com/a/35759828/14955 上的评论:我们需要在90 之后对9 进行排序,以便我们得到990 而不是909。纯字典排序不会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多