返回
去重探秘:揭示数组去重的奥秘与多种实现方式
前端
2023-09-18 18:22:14
数组去重概览
数组去重是指从数组中移除重复的元素,留下不重复的元素。在实际应用中,数组去重经常被用来处理各种数据,例如:
- 从客户列表中移除重复的客户信息
- 从产品列表中移除重复的产品名称
- 从订单列表中移除重复的订单编号
数组去重的方法有很多,每种方法都有其独特的优缺点。在本文中,我们将介绍四种最常用的数组去重方法:
- 双重循环
- Set集合
- 数组排序 + 双指针
- 数组排序 + 二分查找
1. 双重循环
双重循环是最原始的数组去重方法,也是最容易理解的方法。它的基本思路是使用两个循环遍历数组,并在内循环中比较每个元素是否与外循环的元素相同。如果相同,则跳过该元素;如果不同,则将该元素添加到一个新的数组中。
// JavaScript
function removeDuplicates(arr) {
const uniqueArray = [];
for (let i = 0; i < arr.length; i++) {
let isUnique = true;
for (let j = 0; j < i; j++) {
if (arr[i] === arr[j]) {
isUnique = false;
break;
}
}
if (isUnique) {
uniqueArray.push(arr[i]);
}
}
return uniqueArray;
}
# Python
def remove_duplicates(arr):
unique_array = []
for i in range(len(arr)):
is_unique = True
for j in range(i):
if arr[i] == arr[j]:
is_unique = False
break
if is_unique:
unique_array.append(arr[i])
return unique_array
// Java
public static int[] removeDuplicates(int[] arr) {
List<Integer> uniqueArray = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
boolean isUnique = true;
for (int j = 0; j < i; j++) {
if (arr[i] == arr[j]) {
isUnique = false;
break;
}
}
if (isUnique) {
uniqueArray.add(arr[i]);
}
}
return uniqueArray.stream().mapToInt(i -> i).toArray();
}
// C++
vector<int> removeDuplicates(vector<int>& arr) {
vector<int> uniqueArray;
for (int i = 0; i < arr.size(); i++) {
bool isUnique = true;
for (int j = 0; j < i; j++) {
if (arr[i] == arr[j]) {
isUnique = false;
break;
}
}
if (isUnique) {
uniqueArray.push_back(arr[i]);
}
}
return uniqueArray;
}
2. Set集合
Set集合是另一种常用的数组去重方法。Set集合是一种无序集合,它只能存储不重复的元素。因此,我们可以将数组中的元素添加到Set集合中,然后将Set集合转换为数组,即可得到一个不重复的数组。
// JavaScript
function removeDuplicates(arr) {
const uniqueSet = new Set(arr);
return [...uniqueSet];
}
# Python
def remove_duplicates(arr):
unique_set = set(arr)
return list(unique_set)
// Java
public static int[] removeDuplicates(int[] arr) {
Set<Integer> uniqueSet = new HashSet<>();
for (int i : arr) {
uniqueSet.add(i);
}
return uniqueSet.stream().mapToInt(i -> i).toArray();
}
// C++
vector<int> removeDuplicates(vector<int>& arr) {
set<int> uniqueSet;
for (int i = 0; i < arr.size(); i++) {
uniqueSet.insert(arr[i]);
}
return vector<int>(uniqueSet.begin(), uniqueSet.end());
}
3. 数组排序 + 双指针
数组排序 + 双指针是一种更优化的数组去重方法。它的基本思路是先将数组排序,然后使用两个指针遍历数组。当两个指针指向相同的元素时,跳过该元素;当两个指针指向不同的元素时,将后一个指针指向的元素添加到一个新的数组中。
// JavaScript
function removeDuplicates(arr) {
arr.sort();
const uniqueArray = [];
let prev = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] !== prev) {
uniqueArray.push(arr[i]);
prev = arr[i];
}
}
return uniqueArray;
}
# Python
def remove_duplicates(arr):
arr.sort()
unique_array = []
prev = arr[0]
for i in range(1, len(arr)):
if arr[i] != prev:
unique_array.append(arr[i])
prev = arr[i]
return unique_array
// Java
public static int[] removeDuplicates(int[] arr) {
Arrays.sort(arr);
List<Integer> uniqueArray = new ArrayList<>();
int prev = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] != prev) {
uniqueArray.add(arr[i]);
prev = arr[i];
}
}
return uniqueArray.stream().mapToInt(i -> i).toArray();
}
// C++
vector<int> removeDuplicates(vector<int>& arr) {
sort(arr.begin(), arr.end());
vector<int> uniqueArray;
int prev = arr[0];
for (int i = 1; i < arr.size(); i++) {
if (arr[i] != prev) {
uniqueArray.push_back(arr[i]);
prev = arr[i];
}
}
return uniqueArray;
}
4. 数组排序 + 二分查找
数组排序 + 二分查找是另一种更优化的数组去重方法。它的基本思路是先将数组排序,然后使用二分查找算法在数组中查找重复的元素。找到重复的元素后,将该元素从数组中删除。
// JavaScript
function removeDuplicates(arr) {
arr.sort();
let uniqueArray = [];
let prev = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] !== prev) {
uniqueArray.push(arr[i]);
prev = arr[i];
}
}
return uniqueArray;
}
# Python
def remove_duplicates(arr):
arr.sort()
unique_array = []
prev = arr[0]
for i in range(1, len(arr)):
if arr[i] != prev:
unique_array.append(arr[i])
prev = arr[i]
return unique_array
// Java
public static int[] removeDuplicates(int[] arr) {
Arrays.sort(arr);
List<Integer> uniqueArray = new ArrayList<>();
int prev = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] != prev) {
uniqueArray.add(arr[i]);
prev = arr[i];
}
}
return uniqueArray.stream().mapToInt(i ->