Ani*_*ond -3 algorithm data-structures
我正在看这个挑战:
给定的是一个字符串。该字符串的字符是从其原始版本中打乱的。原始版本是一系列数字名称,例如“七九四八”,但没有空格。给定随机顺序的字母串,按严格降序以十进制格式打印它们。
例子
输入:
nieignhtesevfouenr预期输出:
9874
我还没有找到解决这个挑战的方法,因为一个字母可能属于多个数字。例如,“e”可能属于“八”或“一”或“七”或“九”......这怎么办?
您可以应用此算法:
首先统计输入字符串中每个字母的出现次数。例如,示例输入字符串出现以下情况:
{
"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”的数量,则可以扣除“0”出现的次数,并且可以从“z”、“e”、“r”和“o”中扣除该计数。应该为输出记录那么多“0”。
完成上述操作后,我们可以继续以下操作:
考虑到这些之后,我们最终可以得出结论:
我们可以简化一点,因为有些字母在决定代表哪些数字时并没有真正发挥作用。例如,在上面的逻辑中,我们不关心“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)