应用HashSet去掉数组的重复数据

本文分享了一次面试经历,面试者被问及如何去除数组中的重复数据。文中介绍了两种方法:一种是对数组进行排序并遍历移除重复项;另一种是利用HashSet的数据结构特性直接过滤掉重复数据,后者更为高效。

今天面试被问到“怎么去掉数组中的重复数据”?

我首先想到的思路是:1对数组排序; 2遍历数组移除重复数据

显然我的回答没有让面试官惊喜,哭大哭

然后又被问到HashSet是一个什么东西?

唉,原来这才是你最想听的答案呢。。。。

也就是说应用HashSet数据不可重复的属性对数组操作,然后再转成数组,对数组打印输出。

这个办法的确比我的巧妙,我的思路就单一个对数组删除数据就够低级的,该操作效率很低。

实现如下:




在 Java 中删除数组中的复元素通常需要借助额外的数据结构,例如 `Set` 或者通过手动遍历、比较的方式实现。以下是几种常见方法: ### 方法一:使用 HashSet ```java import java.util.HashSet; public class RemoveDuplicates { public static int[] removeDuplicates(int[] array) { if (array == null || array.length == 0) return array; // 使用HashSet存储唯一 HashSet<Integer> set = new HashSet<>(); for (int num : array) { set.add(num); } // 将结果转回数组 int[] result = new int[set.size()]; int index = 0; for (Integer num : set) { result[index++] = num; } return result; } public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 2, 6}; int[] uniqueArr = removeDuplicates(arr); System.out.print("后的数组: "); for (int i : uniqueArr) { System.out.print(i + " "); } } } ``` **优点**:简单高效; **缺点**:可能会改变原数组的顺序。 --- ### 方法二:双层循环手动比对并移除复项 如果想保持原有顺序,则可以采用这种方法。 ```java public class ManualRemoveDuplicates { public static int[] removeDuplicates(int[] array) { if (array == null || array.length <= 1) return array; int n = array.length; boolean isDuplicate; int newSize = 0; // 创建一个新的临时数组用于存放无复的结果 int[] tempArray = new int[n]; for (int i = 0; i < n; i++) { isDuplicate = false; // 检查当前数字是否已经存在于tempArray中 for (int j = 0; j < newSize; j++) { if (array[i] == tempArray[j]) { isDuplicate = true; break; } } // 如果复元素就加入到新数组中 if (!isDuplicate) { tempArray[newSize++] = array[i]; } } // 截取有效长度部分返回 return Arrays.copyOf(tempArray, newSize); } public static void main(String[] args) { int[] arr = {7, 8, 9, 10, 7, 11}; int[] noDupes = removeDuplicates(arr); System.out.println("原始数组:"); System.out.println(Arrays.toString(arr)); System.out.println("复后的数组:"); System.out.println(Arrays.toString(noDupes)); } } ``` **优点**: 依赖外部库; **缺点**: 效率较低(O(n^2)),只适合小规模数据处理场景。 --- ### 方法三:先排序再逐一检查相邻位置是否存在相同的数 这种方式适用于当需要保留原来顺序的情况,并且效率较高(O(nlogn))。 ```java import java.util.Arrays; public class SortThenRemoveDups { public static int[] removeDuplicates(int[] array){ if(array==null||array.length<=1)return array; Arrays.sort(array); // 先将数组从小到大排列 int slow=0,fst=1; while(fst<array.length){ if(array[fst]!=array[slow]){ slow++; array[slow]=array[fst]; } fst++; } return Arrays.copyOfRange(array,0,slow+1); } public static void main(String []args){ int[] nums={4,3,2,4,5,2}; int[] res=removeDuplicates(nums); System.out.println(Arrays.toString(res)); //[2, 3, 4, 5] } } ``` 以上三种方法各有优劣,在实际应用时可根据需求选择合适的一种方式进行操作!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值