给出一串随机顺序的数字,您必须以严格降序的十进制格式打印它们

Ani*_*ond -3 algorithm data-structures

我正在看这个挑战:

给定的是一个字符串。该字符串的字符是从其原始版本中打乱的。原始版本是一系列数字名称,例如“七九四八”,但没有空格。给定随机顺序的字母串,按严格降序以十进制格式打印它们。

例子

输入: nieignhtesevfouenr

预期输出: 9874

我还没有找到解决这个挑战的方法,因为一个字母可能属于多个数字。例如,“e”可能属于“八”或“一”或“七”或“九”......这怎么办?

tri*_*cot 6

您可以应用此算法:

  • 首先统计输入字符串中每个字母的出现次数。例如,示例输入字符串出现以下情况:

    {
      "e": 4,
      "f": 1,
      "g": 1,
      "h": 1,
      "i": 2,
      "n": 3,
      "o": 1,
      "r": 1,
      "s": 1,
      "t": 1,
      "u": 1,
      "v": 1,
      "w": 0,
      "x": 0,
      "z": 0
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我还包括了未使用的字母,因为它们将在“二”、“六”和“零”中发挥作用,但在此示例输入中未表示它们。

现在我们可以观察到:

  • 输入中的每个“z”都属于“零”;
  • 每个“w”都属于一个“two”;
  • 每个“u”都属于“4”;
  • 每个“x”都属于一个“6”;
  • 每个“g”都属于一个“8”

如果您在输入字符串中找到“z”的数量,则可以扣除“0”出现的次数,并且可以从“z”、“e”、“r”和“o”中扣除该计数。应该为输出记录那么多“0”。

完成上述操作后,我们可以继续以下操作:

  • 剩下的每个“o”都属于一个“一”(因为此时所有“零”、“二”、“四”都已被考虑在内)。
  • 剩下的每个“h”都属于“三”
  • 剩下的每个“f”都属于“五”
  • 剩下的每个“s”都属于“七”

考虑到这些之后,我们最终可以得出结论:

  • 剩下的每个“i”都属于“9”

我们可以简化一点,因为有些字母在决定代表哪些数字时并没有真正发挥作用。例如,在上面的逻辑中,我们不关心“n”或“e”的数量,因此当我们检测到“1”等时,我们最好不要减少它们的数量。上面列出了我们唯一关心的 10 个字母。

最后,我们使用每个数字的计数来构建排序后的字符串。

这是 JavaScript 中的一个实现。它运行示例输入的算法。没有输入验证...假定是数字名称的有效组合:

{
  "e": 4,
  "f": 1,
  "g": 1,
  "h": 1,
  "i": 2,
  "n": 3,
  "o": 1,
  "r": 1,
  "s": 1,
  "t": 1,
  "u": 1,
  "v": 1,
  "w": 0,
  "x": 0,
  "z": 0
}
Run Code Online (Sandbox Code Playgroud)