Java 中从数组中删除重复项2025 年 8 月 18 日 | 阅读 7 分钟 在 Java 中,有几种方法可以从数组中删除重复项,每种方法都满足特定需求。我们将探索诸如使用集合(或 HashSet)、原地对数组进行排序以及使用映射或频率数组等方法。 ![]() 1. 使用集合(或 HashSet)使用 HashSet 可以灵活地处理重复项,特别是当值的范围较宽或未知时。 要存储我们已经看到的元素,请创建一个 HashSet。数组元素将用作键,值可以是整数计数或布尔值。
示例编译并运行输出 Original Array: [22, 33, 44, 22, 33, 66, 11, 88, 44] After removing duplicates: [33, 66, 22, 88, 11, 44] 复杂度分析时间复杂度 为了将元素添加到 HashSet,代码会迭代输入数组一次。添加到 HashSet 的平均时间是常数。然后通过迭代 HashSet 来复制唯一元素。元素数量“n”决定了这两个循环的比例。因此,总时间复杂度为 O(n)。 空间复杂度 代码通过在 HashSet 中存储唯一元素后返回结果,使用新数组。在最坏的情况下,每个组件都是不同的。因此,HashSet 将存储 n 个元素,新数组的大小也将是 n。由于内存使用量与输入的大小成线性关系,因此空间复杂度为 O(n)。 2. 原地对数组进行排序此方法非常适合我们无法使用额外内存的情况。通过先对数组进行排序,所有重复的元素都会彼此相邻,从而可以轻松识别和覆盖它们。 示例编译并运行输出 Sorted array: [11, 22, 33, 44, 66, 88, 44, 66, 88] After remove duplicates: [11, 22, 33, 44, 66, 88] 复杂度分析时间复杂度 Arrays.sort(arr) 调用是影响时间复杂度的主要因素。对于原始类型,Java 的 Arrays.sort() 方法使用双枢轴快速排序算法,该算法的平均和最坏情况时间复杂度为 O(n log n)。之后用于查找唯一元素的循环以线性时间 O(n) 执行。由于排序步骤耗时最长,总时间复杂度为 O(n log n)。 空间复杂度 由于代码在原地操作原始数组,因此空间复杂度为 O(1)。对于原始类型,Arrays.sort() 方法不需要大量额外空间。循环中使用固定数量的变量(i 和 j)。最后一个 Arrays.copyOf() 调用创建了一个新数组,但这只是为了返回结果,而不是为了核心算法的操作,因此辅助空间复杂度保持不变。 3. 使用映射或频率数组当数组元素落在已知、受限范围内时,此方法可能很有帮助。 例如,确定数组的值是否介于 1 到 100 之间。 创建一个与此范围大小相同的新频率数组。最初将其所有组件设置为 0。
示例编译并运行输出 Original Array: [22, 33, 44, 22, 33, 66, 11, 88, 44] After removing duplicates arrays elements: [22, 33, 44, 66, 11, 88] 复杂度分析时间复杂度 由于代码仅一次遍历大小为 n 的输入数组,因此时间复杂度为 O(n)。在循环内部,HashMap 的 containsKey 和 put 操作平均需要 O(1) 时间。因此,总时间直接与数组中的元素数量成正比,使其成为线性操作。 空间复杂度 由于使用了 HashMap 和辅助数组 temp,因此空间复杂度为 O(n)。在最坏的情况下,输入数组中的所有元素都是唯一的。这意味着 HashMap 将存储 n 个元素,并且在调整大小之前,temp 数组也将存储 n 个元素。这两种结构所需的空间与输入数组的大小成线性比例。 结论使用集合的平均时间复杂度为 O(n),由于其简单性和速度,是首选方法。然而,最大的两个缺点是它占用了更多空间并且原始元素的顺序丢失了。由于它使用 O(1) 的额外空间,因此当这是首要任务时,原地排序是最佳选择。 排序步骤(时间复杂度为 O(n log n))会减慢其速度并改变原始顺序。使用平均时间复杂度 O(n) 的映射方法是一种快速灵活的选择。如果我们必须执行其他任务,例如计算每个元素出现的次数,那么它特别有用。与集合方法类似,它会占用额外空间,并且不会保留原始顺序。 Java 数组去重 MCQs1. 使用集合删除重复项的平均时间复杂度为 _______。
答案:c) 解释:文本指出,集合方法提供平均时间复杂度 O(n),因为它只遍历数组一次。 2. 原地排序方法非常适合 _______ 是主要限制的情况。
答案:c) 解释:文本指出,该方法是“内存是主要限制的情况”的理想解决方案。 3. 原地排序方法的主要缺点是,由于排序步骤,其时间复杂度较高,为 O(nlogn)。
答案:b) 解释:文本直接将 O(nlogn) 的时间复杂度与排序步骤关联起来。 4. 当我们需要执行额外任务时,例如计算每个元素的频率,_______ 方法很有用。
答案:a) 解释:文本提到了这个用例,指出映射方法对于计算每个元素的频率很有用。 5. 集合和映射方法的一个主要缺点是它们不会保留原始元素的 _______。
答案:c) 解释:文本指出,集合和映射方法都会导致原始元素顺序丢失。 下一主题Java 中使用数组实现队列 |
这是一个非常有趣的问题,经常在 Google、Amazon、TCS、Accenture、Adobe、Apple、Infosys 等顶级 IT 公司的面试中出现。通过解决这个问题,可以考察应聘者的逻辑能力、批判性思维和解决问题的能力。因此,在本节中,...
5 分钟阅读
Java.nio.DoubleBuffer 具有 rewind() 函数。要重置此缓冲区,请使用 DoubleBuffer 类。如果之前标记了位置,它将被丢弃。此方法在保持限制的同时将位置重置为零。当需要执行多个通道写入时...
阅读 3 分钟
Java 中的最高优先级。优先级是指表达式中运算符的求值顺序。理解运算符优先级对于编写正确高效的代码至关重要,因为它决定了表达式的求值方式。Java 遵循一组规则来确定优先级...
阅读 6 分钟
在 Java 中,数字猜测游戏是一个基本游戏,其中计算机生成一个随机数,玩家在特定范围内尝试猜中它。以下是它的工作原理的快速概述:游戏开始时,计算机生成一个随机数...
5 分钟阅读
Java 8 引入的 java.util.function 包包含 ToLongBiFunction 接口,该接口用于在 Java 中实现函数式编程。它表示一个在接受两个 T 和 U 类型的参数后返回 long 类型结果的函数。它接受两个泛型...
阅读 2 分钟
给定一个字符串 str,我们的任务是找到要构成回文的子字符串,并且它们应该是给定字符串的所有不同的回文子字符串。示例 1:输入:字符串 str = "abbcbbbe" 输出:不同的回文子字符串的总数为 8。它们...
阅读 10 分钟
? Java 是一个直接的应用程序,它不允许您在创建文件时选择文件的组或所有者。如果我们想规范某些特征,我们必须依赖不同的方法或第三方库。本文将……
阅读 4 分钟
Amazon Web Services (AWS) 提供了许多服务,使企业能够在云中开发、部署和管理应用程序和基础设施。监控这些资源以确保它们可靠高效地运行非常重要。AWS CloudWatch 是一种监控服务,它收集和跟踪...
5 分钟阅读
在 Java 中向数组添加元素 在 Java 中,数组是用于在连续内存位置中存储相同类型元素的基本数据结构。尽管数组一旦创建其大小就是固定的,但有不同的方法可以添加元素或创建具有...
5 分钟阅读
相同的链表是指两个链表的数据相同且顺序一致。要在 Java 中确定两个链表是否相似,我们会迭代或递归地比较相应的节点。这包括检查数据和结构,直到所有节点匹配或...
阅读 8 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India