Form Minimum Number from Given Sequence in Java

2025年3月31日 | 阅读 5 分钟

要根据给定的序列构成最小数字,您必须了解序列如何定义数字的排列模式。通常,序列包含“I”(表示递增)和“D”(表示递减)等字符。目标是以遵循此模式的方式排列数字,同时生成尽可能小的数字。

问题陈述

序列 'I' 和 'D' 表示一个模式

  • 'I' (递增): 下一个数字应大于前一个数字。
  • 'D' (递减): 下一个数字应小于当前数字。

目标是找到一个遵循此模式的最小数字,使用 1 到 9 的数字且不重复。序列中的每个字母代表数字中两个相邻数字之间的关系。

示例

输入: "IDID"

输出 13254

这里,序列 "IDID" 指定

  1. 第一个数字应小于第二个数字 ('I')。
  2. 第二个数字应大于第三个数字 ('D')。
  3. 第三个数字应小于第四个数字 ('I')。
  4. 第四个数字应大于第五个数字 ('D')。

满足这些条件最小的数字是 13254。

解决问题的方法

为了高效地解决这个问题,我们可以使用 贪心算法。贪心方法逐个数字构建数字,遵循序列指定的模式并确保生成最小的数字。为提高效率,解决方案还必须避免回溯。

实现解决方案的步骤

  1. 初始化
  2. 使用栈
    • 对于序列中的每个字符
    • 如果字符是 'I',则推送一个能满足递增条件的最小可用数字。
    • 如果字符是 'D',则推送一个能满足递减条件的最小可用数字。
    • 栈有助于临时存储数字,以便它们可以被正确地重新排列。
  3. 构成数字
    • 整个序列处理完毕后,栈中的内容用于构成最小数字。

让我们用 Java 程序实现上述方法。

文件名: MinNumberFromSequence.java

输出

 
Minimum number for sequence 'IDID': 13254
Minimum number for sequence 'III': 1234
Minimum number for sequence 'DDI': 3214   

解释

  1. StringBuilder result = new StringBuilder();
    我们使用 `StringBuilder` 在处理序列时高效地构建结果。
  2. Stack<Integer> stack = new Stack<>();
    使用栈临时存储数字。当序列中遇到 'I' 时,栈有助于我们反转数字的顺序。
  3. for (int iterate = 0; iterate <= sequence.length(); i++)
    我们遍历序列中的每个字符。循环比序列长度多一步,以确保栈中任何剩余的数字都会附加到结果中。
  4. stack.push(iterate + 1);
    随着我们前进到每个位置,我们将数字(1、2、3...)推入栈中。
  5. if (iterate == sequence.length() || sequence.charAt(iterate) == 'I')
    我们检查当前字符是否为 'I' 或是否已到达序列末尾。发生这种情况时,我们将栈中的所有元素弹出并附加到 `result`。这确保了当遇到 'I' 时,数字按升序放置。
  6. result.append(stack.pop());
    我们将数字从栈中弹出并附加到结果中。这构成了遵循给定序列的最小可能数字。

复杂度分析

时间复杂度

此解决方案的时间复杂度为 O(n),其中 n 是序列的长度。每个元素在栈中被推入和弹出一次,从而得到一个高效的方法。

空间复杂度

由于使用栈来临时存储数字,空间复杂度为 O(n)。

测试解决方案

让我们通过一些测试用例来运行

  1. 测试用例 1: "IDID"
    • 模式: I -> D -> I -> D
    • 最小数字: 13254
  2. 测试用例 2: "III"
    • 模式: I -> I -> I
    • 最小数字: 1234
  3. 测试用例 3: "DDI"
    • 模式: D -> D -> I
    • 最小数字: 3214

这些示例表明,该算法根据序列正确地生成最小数字。

边缘情况

该算法还应处理边缘情况

  1. 空序列
    • 空序列应返回 "1",因为只有一个可用数字。
  2. 全是 'D' 或全是 'I'
    • 全为 'I' 的序列(例如 "III")应返回递增序列,如 "1234"。
    • 全为 'D' 的序列(例如 "DDD")应返回递减序列,如 "4321"。
  3. 更长的序列
    • 该算法即使对于更长的序列也能高效运行。例如,对于长度为 9 的序列(如 "IDIDIDIDI"),基于栈的方法可确保在最短的时间内生成数字。

结论

此解决方案使用贪心方法和栈进行临时存储,高效地构建了遵循给定模式的最小数字。代码在时间和空间复杂度方面都得到了优化,适合处理大型输入。该方法和提供的代码都非常直接,确保了清晰度和正确性,同时处理各种场景。

通过理解问题并使用基于栈的算法,我们实现了构成给定序列中最小数字的高效解决方案。