JAVA去掉一个已排序数组的重复数字

本文提供了一个去除已排序Java数组中重复元素的方法,并通过一个具体示例展示了如何实现这一功能。
原文地址:http://www.java2000.net/p11764

论坛讨论地址: http://topic.youkuaiyun.com/u/20081109/14/EB2F41BF-52C3-4F9A-A7AD-F590A83887CC.html

我的一个方案,不过肯定有提升速度的地方
  1. import java.util.Arrays;

  2. /**
  3.  * JAVA去掉一个已经排好序的数组的重复数字,尽量快.
  4.  * 
  5.  * @author 老紫竹 JAVA世纪网(java2000.net)
  6.  * 
  7.  */
  8. public class Test {

  9.   public static void main(String args[]) {
  10.     int[] arr = { 1223344555667899101111,
  11.         11121213141415 }; // 预设数据数组
  12.     int index = 1// 保存最后一个不重复的位置
  13.     int last = arr[0];
  14.     for (int i = 1; i < arr.length; i++) {
  15.       if (arr[i] != last) {
  16.         arr[index] = arr[i];
  17.         last = arr[index];
  18.         index++;
  19.       }
  20.     }
  21.     int[] rtn = new int[index];
  22.     System.arraycopy(arr, 0, rtn, 0, index);
  23.     System.out.println(Arrays.toString(rtn));
  24.   }
  25. }

特别是步长的部分。

<think>好的,用户的问题是在Java中去除数组中的重复元素。我需要根据提供的引用内容来回答这个问题。首先,看看用户提供的引用中有哪些相关的解决方案。 引用[1]、[2]、[3]、[4]都是关于从已排序数组中删除重复元素的Java实现。这些方法通常使用双指针法,一个快指针遍历数组,慢指针记录不重复的位置。这种方法时间复杂度是O(n),空间复杂度是O(1),适用于已排序数组。 引用[5]提到了处理允许重复两次的情况,但用户的问题可能只需要基本去重,所以暂时可以忽略这部分,除非用户有进一步的需求。 用户的问题中没有明确数组是否已排序。如果是已排序数组,使用双指针法效率最高。但如果是未排序数组,可能需要不同的方法,比如使用HashSet,这会增加空间复杂度到O(n),但时间复杂度也是O(n)。或者先排序数组,再用双指针法,时间复杂度O(n log n)。 根据引用内容,用户提供的例子都是针对已排序数组的,因此可能用户的问题中的数组已排序的。但为了全面回答,我应该同时考虑两种情况:已排序和未排序数组。 需要分步骤说明: 1. 针对已排序数组的双指针法,如引用中的例子,详细解释代码逻辑,并给出示例代码。 2. 针对未排序数组的方法,比如使用HashSet或者LinkedHashSet来保持顺序,或者先排序后处理。但要注意,HashSet会打乱顺序,如果用户需要保持原顺序,可能需要用其他方法。 此外,需要确保代码正确,比如在双指针法中如何处理边界情况,比如空数组。引用中的代码示例都处理了数组长度为0的情况,这点需要注意。 可能还需要比较不同方法的优缺点,比如时间空间复杂度,适用场景,帮助用户选择合适的方法。 另外,用户提供的引用中有多个代码示例,可能存在细微差异,需要指出它们的共同点和不同点。例如,引用[1]中的方法使用j从0开始,当元素不同时,先递增j再赋值;而引用[3]中的方法使用idx从1开始,sentinel记录当前元素。虽然实现不同,但核心思想都是双指针。 最后,根据用户的问题,生成相关问题,比如性能分析、优化方法、应用场景等,但需要调整以适应去重问题,例如如何处理未排序数组,如何保持元素顺序等。</think>在Java中去除数组重复元素的方法根据数组是否已排序可分为两类,以下是具体实现步骤及代码示例: ### 一、已排序数组去重(最优方案) 使用双指针法实现$O(n)$时间复杂度和$O(1)$空间复杂度: ```java public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int j = 0; for (int i = 0; i < nums.length; i++) { if (nums[j] != nums[i]) { nums[++j] = nums[i]; } } return j + 1; } ``` 该方法通过快慢指针遍历数组,当发现不同元素时更新慢指针位置[^1][^2][^3]。最终返回的j+1表示新数组长度,原数组前j+1位即为去重结果。 ### 二、未排序数组去重 #### 1. 使用HashSet(不保留顺序) ```java public static int[] removeDuplicates(int[] nums) { Set<Integer> set = new HashSet<>(); for (int num : nums) set.add(num); return set.stream().mapToInt(Integer::intValue).toArray(); } ``` #### 2. 使用LinkedHashSet(保留顺序) ```java public static int[] removeDuplicatesOrdered(int[] nums) { Set<Integer> set = new LinkedHashSet<>(); for (int num : nums) set.add(num); return set.stream().mapToInt(Integer::intValue).toArray(); } ``` #### 3.排序后处理(推荐) ```java public static int[] removeDuplicatesWithSort(int[] nums) { Arrays.sort(nums); int j = 0; for (int i = 0; i < nums.length; i++) { if (nums[j] != nums[i]) { nums[++j] = nums[i]; } } return Arrays.copyOf(nums, j + 1); } ``` ### 方法对比 | 方法 | 时间复杂度 | 空间复杂度 | 是否保持顺序 | 适用场景 | |--------------------|-------------|-----------|------------|-----------------------| | 双指针法 | $O(n)$ | $O(1)$ | ✓ | 已排序数组[^1][^3] | | HashSet | $O(n)$ | $O(n)$ | × | 快速去重无需顺序 | | LinkedHashSet | $O(n)$ | $O(n)$ | ✓ | 需保持原顺序 | | 先排序后处理 | $O(n\log n)$| $O(1)$ | × | 未排序数组内存敏感场景 |
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值