返回

去重探秘:揭示数组去重的奥秘与多种实现方式

前端

数组去重概览

数组去重是指从数组中移除重复的元素,留下不重复的元素。在实际应用中,数组去重经常被用来处理各种数据,例如:

  • 从客户列表中移除重复的客户信息
  • 从产品列表中移除重复的产品名称
  • 从订单列表中移除重复的订单编号

数组去重的方法有很多,每种方法都有其独特的优缺点。在本文中,我们将介绍四种最常用的数组去重方法:

  1. 双重循环
  2. Set集合
  3. 数组排序 + 双指针
  4. 数组排序 + 二分查找

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 ->