Java 中打印数字中包含 1、2 和 3 的升序数字

2025年5月12日 | 阅读 5 分钟

目标是以升序打印包含数字 1、2 和 3 的数字数组,并用逗号分隔。如果没有包含数字 1、2 和 3 的数字,则打印 -1。

示例 1

输入: num_arr[] = {9821, 627183, 12, 1234}

输出1234, 627183

解释

9821 → 包含 1 和 2,但缺少 3。

627183 → 包含 1、2 和 3 → 包含

12 → 包含 1 和 2,但缺少 3 → 不包含

1234 → 包含 1、2 和 3 → 包含

示例 2

输入: num_arr[] = {456, 789, 321, 2134}

输出2134, 321

解释

456 → 缺少数字 1、2 和 3 → 不包含

789 → 缺少数字 1、2 和 3 → 不包含

包含 1、2 和 3 → 包含

2134 → 包含 1、2 和 3 → 包含

示例 3

输入: num_arr[] = {100, 150}

输出-1

解释

范围 [100, 150] 内的数字都不包含第一个、第二个和第三个数字。

方法:使用 Collections.sort() 方法

该软件使用 ArrayList 进行排序和动态存储,确保有效处理有效数字。它使用 String 操作 (contains()) 而不是数学运算来验证数字的存在,这使得验证更容易。

使用 Collections.sort() 可确保 O(N log N) 的排序复杂度。为了有效地连接字符串而不要求额外的内存分配,使用了 StringBuffer。该应用程序使用 O(N) 复杂度的迭代方法来扫描和过滤数字。

结合这些策略将确保完美实施和最佳性能。

算法

步骤 1:创建一个空的 ArrayList<Integer> 来存储包含 1、2 和 3 的数字。

步骤 2:调用 findOneTwoThree(n) 迭代 num_arr 中的每个整数 n,以确定 n 是否包含 1、2 和 3。

步骤 3:如果为 true,则将 n 添加到列表中。

步骤 4:使用 Collections.sort (arr) 对列表进行升序排序。

步骤 5:创建一个 StringBuffer 来存储格式化后的输出。

步骤 6:在遍历排序列表时,使用“,”分隔每个数字,并将其附加到 StringBuffer。

步骤 7:如果 StringBuffer 为空,则返回“ -1”,否则返回格式化字符串。

步骤 8:使用函数 Integer.toString(n) 将 n 转换为字符串 s。

步骤 9:利用 s.contains() 确定 s 是否包含“1”、“2”和“3”。

步骤 10:如果三个数字都存在,则返回 true;否则返回 false。

实施

输出

 
321, 2134   

复杂度分析

上述代码的时间复杂度为 O(N log(N)),其中 N 是给定数字的长度,空间复杂度为 O(N)。

方法:使用动态规划

为了优化重复检查,代码通过 HashMap 使用记忆化存储先前计算的结果。模 (%) 和除 (/) 运算用于有效提取数字。通过监控足够数字的存在,布尔标志 (has1, has2, has3) 减少了不必要的迭代。为了减少不必要的计算,动态规划 (DP) 通过在记忆化中缓存结果来实现。ArrayList 用于列表方法中的有效插入,它确保了有效数字的动态存储。为了提高执行速度并降低计算成本,使用条件检查来优化函数调用。

算法

步骤 1:创建一个记忆化 HashMap<Integer, Boolean> 来存储先前验证过的整数及其结果。

步骤 2:如果 n 存在于记忆化中,则返回存储的结果。

步骤 3:使用 has1 = false、has2 = false 和 has3 = false 初始化布尔标志。

步骤 4:使用除法 (/10) 和模数 (% 10) 从 n 中提取数字。

步骤 5:如果数字是 1,则设置 has1 = true;如果数字是 2,则设置 has2 = true;如果数字是 3,则设置 has3 = true。

步骤 6:持续提取数字,直到 n 等于 0。

步骤 7:在记忆化中存储结果(如果所有三个数字都已找到,则为 true;否则为 false)。

步骤 8:返回结果。

步骤 9:为了存储有效数字,初始化一个空列表 res。

步骤 10:对 num_arr 中的每个 n 重复执行此操作

步骤 10.1:逐个遍历 num_arr 中的每个 n:调用 contains123(n)。

步骤 10.2:然后,如果返回 true,则将 n 添加到 res 中。

步骤 11:返回 res。

实施

输出

 
[321, 2134]   

复杂度分析

上述代码的时间复杂度为 O(N log(M)),其中 N 是给定数字的长度,M 是 num_arr 中的最大数字。空间复杂度为 O(N)。


下一主题Java ASCII 表