Java 中将数字字符串拆分为素数2024年9月10日 | 11 分钟阅读 给定一个仅包含数字的字符串,该字符串表示一个数字。我们的任务是以一种方式拆分这个数字字符串,使得拆分后形成的每个数字段都是一个素数。此外,我们还需要最小化拆分次数。请注意,如果输入字符串本身表示一个素数,则最小拆分次数为 1,因为我们将其视为一个整体。找到的素数必须在 1 到 10^6 的范围内。让我们通过一些例子来理解这一点。 示例 1 输入 "13477317" 输出 2 解释:如果我们进行 1 次拆分,那么我们将 13477317 视为一个整体,数字 13477317 可以被 3 整除。因此,无法进行 1 次拆分。现在,我们进行 2 次拆分,发现 13477 是一个素数,317 也是一个素数。因此,在 2 次拆分后,我们得到了所有段都是素数。 示例 2 输入 "17" 输出 1 解释:如果我们进行 1 次拆分,那么我们将 17 视为一个整体,数字 13477317 是一个素数。因此,1 次拆分就足够了。 让我们看看查找拆分的不同方法。 使用递归核心思想是考虑最多 6 位数的每个前缀(因为已知素数小于 10^6),并验证它是否是素数。如果是素数,则递归调用方法来验证剩余的字符串。如果任何组合未能给出适当的排列,则会在控制台上显示一条适当的消息。 文件名:SplitStringPrimes.java 输出 For the number 343, the minimum number of splits is: 2 For the number 37, the minimum number of splits is: 1 For the number 44, the minimum number of splits is not possible. For the number 367555, the minimum number of splits is: 4 复杂度分析 上述程序的 time complexity 为 O(N5 / 2),其中 O(N2) 时间用于递归查找所有可能的组合。由于我们还需要检查数字是否为素数,这项任务的时间复杂度为 O(N1 / 2)。因此,上述程序的总时间复杂度为 O(N2) * O(N1 / 2) = O(N5 / 2),其中 N 是输入字符串中的总位数。 使用迭代使用迭代,可以通过动态规划来解决此问题。 我们可以定义一个数组 splitArr[],并使用它,其中 splitArr[q] 表示长度为“q”的前缀字符串拆分为素数子集所需的最小拆分数。 数组 splitArr[] 的填充方式如下:
当所有值都更新后,最后一个索引处的值就是我们的答案,因为它包含了整个输入字符串的最小拆分数。 文件名:SplitStringPrimes1.java 输出 For the number 343, the minimum number of splits is: 2 For the number 37, the minimum number of splits is: 1 For the number 44, the minimum number of splits is not possible. For the number 367555, the minimum number of splits is: 4 复杂度分析 上述程序的 time complexity 为 O(N3 / 2),其中 O(N) 时间用于遍历所有索引。我们还需要检查数字是否为素数,这项任务的时间复杂度为 O(N1 / 2)。因此,上述程序的总时间复杂度为 O(N) * O(N1 / 2) = O(N3 / 2),其中 N 是输入字符串中的总位数。 我们知道此问题中的素数范围是从 1 到 10^6。我们可以利用此信息进行进一步优化。通过预先计算素数检查并将结果存储在数组中,可以实现进一步优化。预先计算可以使用埃拉托斯特尼筛法进行。请注意以下程序。 文件名:SplitStringPrimes2.java 输出 For the number 343, the minimum number of split is: 2 For the number 37, the minimum number of split is: 1 For the number 44, the minimum number of split is not possible. For the number 367555, the minimum number of split is: 4 复杂度分析 这是最优化的方法,因为上述程序的 time complexity 为 O(N),其中 N 是输入字符串中的总位数。尽管计算筛法的时间复杂度为 O(N * log(N)),但我们可以忽略它,因为它只计算一次。因此,与其他程序不同,我们可以在 O(1) 时间内检查一个数字是否为素数。 下一个主题Java Cron 表达式 |
实例变量隐藏仅发生在子类定义了一个与其父类中的变量同名的变量时。当子类实例访问该变量时,将使用子类变量。仍然可以使用 super 关键字访问父类变量。程序 1:……
阅读 4 分钟
在本节中,我们将讨论如何在 Java 中反转链表。反转链表是面试中最常问到的主题之一。任务是反转一个链表,给定头节点或第一个节点...
阅读 10 分钟
有时,我们需要将字符列表转换为字符串。字符串是字符序列,因此我们可以轻松地从字符数组创建字符串。我们有一些特殊的字符串,例如回文串(一种相同的字符串……
阅读 4 分钟
List 是使用最广泛的集合接口之一,用于存储有序集合。List 接口维护元素的插入顺序,并且也可以存储重复值。要了解更多关于 Java List 接口的知识,有以下三种方法...
5 分钟阅读
由于接口可以包含泛型类型参数,因此我们可以在 Java 中开发更灵活和可重用的接口。泛型接口可用于定义可以处理各种不同数据类型的类、方法和其他各种接口。声明任意接口遵循...
5 分钟阅读
计算机科学和编程领域有许多有趣的问题,它们不仅挑战开发人员,还为高效的算法解决方案提供了见解。其中一个问题是范围加法问题,它经常在各种面试、竞争性设计竞赛和实际应用中遇到...
阅读 6 分钟
Java Stream API 中的 noneMatch() 方法是一个基本函数,用于评估给定流中的元素是否满足特定条件。当我们需要证明集合中的任何项都不匹配时,它特别有用...
11 分钟阅读
在本节中,我们将学习如何在Java中找到jacobsthal数。在数学上,jacobsthal数定义为:Ja = (2a - (-1)a) / 3 其中 a >= 0 因此,对于 a = 0,J0 = (20 - (-1)0) / 3 = (1 - (1)) / 3 =...
阅读 6 分钟
在不断发展的软件开发世界中,并发和并行是基本概念。这些技术使开发人员能够充分利用现代多核处理器,从而更快、更有效地执行程序。Java 作为一种广泛使用的编程语言,一直提供支持并发的功能……
阅读 8 分钟
字符串压缩是计算机科学和编程中的一个基本问题,其目标是通过计算连续重复字符来压缩字符串。该问题的本质是更有效地表示字符串,尤其是在处理大型数据集时。这种技术在各种场景下都很有用...
7 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India