Java Program to Check Whether an Array is a Permutation2025年3月26日 | 阅读 8 分钟 数组排列要确定数组 A 是否为排列,请确保它仅包含从 1 到 n 的每个数字一次,并且没有重复的元素。这证实了数组是一个完整且有效的序列。 数组排列示例示例 1 输入: arr[] = {4, 1, 3, 2} 输出: 是 解释: 给定的 数组 是一个有效的排列,因为它包含了从 1 到 4 的所有数字。请注意,每个数字只出现一次。 示例 2 输入: arr[] = {1, 2, 3, 5, 5} 输出: 否 解释: 包含两个 5 的数组是无效的,因为它缺少数字 4,因此不是大小为 5 的有效排列。 解决问题的方法蛮力搜索方法该方法通过蛮力法检查从 1 到 n 的每个数字来验证数组是否为排列。嵌套循环导致时间复杂度为 O(n^2),使其简单但不适用于大型数组。 算法 步骤 1: 一个大小为 size 的整数数组 array。 步骤 2: 从 1 到 size 迭代每个数字 num。 步骤 3: 对于每个 num,初始化一个布尔标志 isFound 为 false。迭代数组以检查 num 是否存在。
步骤 4: 验证数组是否为排列。确保所有元素都在 1 和数组的大小或长度之间。 步骤 5: 如果是排列则打印“是”,否则打印“否”。 让我们在 Java 程序中实现上述方法。 文件名:PermutationCheck.java 输出 Yes 时间复杂度: 由于 嵌套循环,时间复杂度为 O(n^2)。 辅助空间复杂度: 空间复杂度为 O(1),因为只使用了少量额外变量。 使用 Set 数据结构使用 Set 数据结构 可以确保所有元素都是唯一的,并且可以高效地检查是否包含所有预期的元素。它会自动处理重复项,并提供快速的插入和查找操作,非常适合验证排列等任务。 算法 步骤 1: 初始化一个空的 Set 来存储数组中的唯一元素。 步骤 2: 将每个项添加到 Set 中,并记录看到的最高值。 步骤 3: 如果数组长度不等于最大值,则返回 false。 步骤 4: 检查 Set 的大小是否与数组的长度匹配。如果匹配,则每个元素都不同且在指定范围内。 步骤 5: 如果两个条件都满足,则给定数组是排列;否则不是排列。 让我们在 Java 程序中实现上述方法。 文件名:PermutationCheck.java 输出 Yes 时间复杂度: O(N log N),因为将 N 个元素插入 Set。 辅助空间: O(N),用于在 Set 中存储多达 N 个唯一元素。 使用排序和比较的方法排序和比较方法首先按升序对数组进行排序。然后检查每个元素是否与其预期值匹配,从而确认数组正好包含从 1 到大小的所有整数。 算法 步骤 1: 将数组按递增顺序排列。 步骤 2: 遍历已排序数组中的每个项。 步骤 3: 检查索引 i 处的每个元素是否等于 i + 1。如果不等于,则返回 false。 步骤 4: 如果所有元素都与其预期值匹配,则返回 true,表示数组是排列。 步骤 5: 完成 函数 并根据检查输出结果。 让我们在 Java 程序中实现上述方法。 文件名:PermutationCheck.java 输出 Yes 时间复杂度: O(N log N),由于排序操作。 辅助空间: O(1),因为排序是就地完成的。 使用布尔数组跟踪访问的方法该方法使用一个布尔数组来跟踪访问过的元素,确保从 1 到 N 的每个数字恰好出现一次。如果数字重复或超出预期范围,则返回 false。否则,它会确认数组是排列。 算法 步骤 1: 定义一个大小与原始数组相同的布尔数组,并将其所有元素初始化为 false。该数组跟踪已看到的数字。 步骤 2: 对于输入数组中的每个元素
步骤 3: 遍历完输入数组后,检查 seen 数组以确保从 1 到 length 的所有元素都存在。 步骤 4: 检查 seen 数组中是否有任何值仍然为 false。如果是,则返回 false,因为该数组不是有效的排列。 步骤 5: 如果所有值都为 true 且没有重复项,则返回 true,表示该数组是有效的排列。 让我们在 Java 程序中实现上述方法。 文件名:PermutationChecker.java 输出 YES 时间复杂度: 代码遍历数组两次。因此,时间复杂度为 O(N),这直接与元素数量相关。 辅助空间: 代码使用大小为 N 的布尔数组来跟踪已看到的数字。需要 O(N) 的额外空间。 |
并发是现代软件开发的一个基本方面,Java 提供了多种机制来高效地处理并发任务。Java 中常用的两个同步工具是 CyclicBarrier 和 CountDownLatch。尽管它们的名字听起来相似,但这两个类在管理并发操作方面具有不同的用途。在本节中,...
阅读 4 分钟
在 Java 编程世界中,事件驱动的应用程序通常依赖于各种类型的事件来处理用户输入、响应系统事件或执行其他关键任务。Java 提供了一个全面的事件处理框架,包括接口、类和方法来有效管理事件。其中一种...
5 分钟阅读
在 Java 中,Set 和 Array 是两个常用的数据结构。Set 是无序的唯一元素集合,而 Array 是固定大小的有序元素集合。在某些情况下,我们可能需要将 Set 转换为 Array,以便...
阅读 3 分钟
Java 编程语言可以使用 Java Speech API 的内置接口将文本转换为人类可识别的语音。它用于增强用户体验和舒适度。该 API 定义了一个跨平台的 API 来支持命令和控制识别器以及语音合成器。文本 -...
阅读9分钟
什么是? 定义、类型和示例 JDK 包含 ,它们是软件的集成组件。Java 的 API 提供了通信接口和接口,用于各种程序之间的通信。什么是? API 是 JDK 随附的关键软件组件。类、接口和用户界面都是...的示例
阅读 4 分钟
该 语句是与 switch 语句一起使用的条件标签。它包含一个代码块,该代码块仅在 switch 值与 case 匹配时执行。switch 语句可以包含多个 case 标签。每个 case 标签必须包含不同的...
阅读 2 分钟
2048 游戏以其令人上瘾的性质和益智挑战吸引了全球数十万玩家。在本文中,我们将深入探讨 2048 的领域,并提供基于 Java 的游戏实现。此外,我们还将探讨有效的技术,...
阅读 6 分钟
在 Java 中,一元运算符是只能与一个操作数一起使用的运算符。它用于表示正值或负值、将值加/减 1,以及对布尔值取反。一元运算符的类型 Java 中有五种一元运算符:一元...
5 分钟阅读
问题如下:有一个数组;您必须从中选择一个子序列,找出其元素的最大和;此外,子序列中连续元素的索引之间的差值不能超过 6。...
阅读 4 分钟
在 Java 中,Iterator 和 ListIterator 都用于遍历集合。Iterator 允许仅向前遍历,并提供 next() 和 remove() 等基本操作。相比之下,ListIterator 支持双向遍历,以及 add()、set() 和 previous() 等附加操作,使其更加通用。Iterator Iterator 接口是...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India